亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java運行時數據區域和類結構的詳細講解

發布時間:2021-08-02 17:19:39 來源:億速云 閱讀:200 作者:chen 欄目:開發技術

這篇文章主要介紹“java運行時數據區域和類結構的詳細講解”,在日常操作中,相信很多人在java運行時數據區域和類結構的詳細講解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java運行時數據區域和類結構的詳細講解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Java運行時數據區域

java運行時數據區可以分為:方法區、虛擬機棧、本地方法棧、堆和程序計數器

線程私有:虛擬機棧、本地方法棧、程序計數器

線程共享:方法區、堆

程序計數器

一塊較小的內存空間,當前線程所執行字節碼的行號指示器,它是程序控制流的指示器,分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

每條線程都擁有一個獨立的程序計數器。

Java虛擬機棧

線程私有的,它的生命周期與線程相同。

每個方法被執行時,java虛擬機都會創建一個棧幀,用于存儲 局部變量表、操作數棧、動態鏈接、方法出口等信息

動態鏈接:符號在運行中轉化為直接引用的過程,就是動態連接(預支對應的靜態連接,是指類加載階段將靜態的符號引用轉成)。

本地方法棧

作用于java虛擬機棧類似,不過作用的是本地的native 方法。

java堆

線程共享的一塊內存區域,用來存放對象實例。“幾乎”所有的對象都分配在堆中。

由于及時編譯,特別是逃逸分析技術日益請打,對象也不一定分配在堆中(可能棧上分配標量替換)。

java堆中可以劃分出多個線程私有的分配緩沖區(TLAB)來提高對象分配效率,這個TLAB只保證該線程才能在此分配,但是所有線程都是可以進行訪問的。

方法區

線程共享,存放虛擬機加載的類型信息常量靜態變量即時編輯器編譯后的代碼緩存等數據。

方法區的運行時常量池:存放 類加載器中加載Class文件中的常量池表。

java對象內存分配

字節碼new 指令 -> 檢查常量池 ->類加載器(加載、連接(檢查、準備、解析)、初始化)

檢查后,就要為新生對象進行內存分配了。分配策略:

java運行時數據區域和類結構的詳細講解

逃逸分析

分析對象的作用域是否在本方法中,如果只有在本方法中,那么他可以棧上分配,逃逸分析jdk7以后是默認開啟的。

new 的對象不一定在堆中,他可能在棧上分配和標量替換

棧上分配:JVM調優方式之一,方法的對象如果不逃逸在外,那么它可以分配在棧上,他的生命周期與方法調用一致,減小GC的壓力。

標量替換:如果對象不存在逃逸,JVM可能不會創建該對象,而是將該對象變量分解成若干個成員變量所替換,這樣就可以在棧幀或寄存器上分配(不用連續的空間),jdk7默認開啟。標量替換優先于棧上分配。

TLAB:線程本地分配緩存區(也是堆中)

Eden中分配內存時,如果多個線程都同時分配內存,會造成指針碰撞情況,為了提高對象分配效率,使用TLAB。

線程初始化時,會申請一點指定大小的內存,只提供當前線程進行內存分配,這樣每個線程都單獨擁有一個空間。

TLAB是虛擬機在堆內存的eden劃分出來的一塊專用空間。

TLAB沒有沒有足夠空間來滿足操作時,需要向當前線程重新申請新的TLAB

java運行時數據區域和類結構的詳細講解

java類文件結構

class 字節碼的文件結構,嚴格按照順序記性解析

類型名稱備注
u4magic魔數,識別Class文件格式,值為:0XCAFEBABE
u2minor_version副版本號
u2major_version主版本號,45-?,JDK13為57,JDK8為52
u2constant_pool_count常量池計算器
cp_infoconstant_pool常量池,class資源庫
u2access_flags訪問標志,public、final等9個標志。有16個標志位,每一位標識一種訪問標志。
u2this_flags類索引,常量池中的索引值
u2super_class父類索引,常量池中的索引值
u2interfaces_count接口計數器
u2interfaces接口索引集合,常量池中的索引值
u2fields_count字段個數
field_infofields字段集合, 字段標志(public、static等)、字段名常量索引、描述常量索引(類型)
u2methods_count方法計數器
method_infomethods方法集合,和字段集合差不多,方法標志、方法名索引、方法描述索引(返回類型、方法參數列表)
u2attributes_count附加屬性計數器
attribute_infoattributes附加屬性集合

常量池

常量池分為:字面量符號引用

字面量:文本字符串、final常量值等

符號引用:

  • 類、接口全限定名

  • 字段、方法的名稱和描述符

  • 方法句柄和類型

  • 動態調用點和動態常量

常量池項目類型:

java運行時數據區域和類結構的詳細講解

屬性表

Class 文件、字段表、方法表都可以攜帶自己的屬性表集合,描述某些場景專有的信息

java運行時數據區域和類結構的詳細講解

屬性(部分)有:

java運行時數據區域和類結構的詳細講解

比如Code屬性,

java運行時數據區域和類結構的詳細講解

類加載機制

類加載過程:

加載 -> 鏈接 (驗證、準備、解析) -> 初始化

加載:用類加載器加載字節碼

驗證:驗證字節碼的合法性(滿足約束條件)

準備:被加載類的靜態字段分配內存

解析:符號引用解析成實際引用。

初始化:初始化常量、靜態類

類加載器:

啟動類加載器:加載最基礎的最重要的類,如JRE的lib下的jar包中的類

擴展類加載器:他的弗雷是啟動類加載器,主要加載相對次要但又通用的類,如JRE的lib/ext下的jar的類

應用類加載器:他的父類是擴展類加載器,負責加載應用程序路徑下的類。(指虛擬機參數 -cp/-classpath、系統變量 java.class.path或環境變量 CLASSPATH 所指定的路徑)

同一字節流經過不同類加載器加載,也會得到兩個不同的類。

雙親委派模式:讓父加載器盡量加載

雙親委派模式的破壞:

1)如果上層類加載器加載的類 加載 下層的類加載器加載的類

java引入了上下文類加載器,可以打通弗雷加載器去請求子類加載器加載的行為。如JNDI調用服務代碼的時候。

2)OSGI熱部署,使用網狀的類加載模式。

到此,關于“java運行時數據區域和類結構的詳細講解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沁水县| 临泽县| 宜都市| 鹰潭市| 攀枝花市| 临夏县| 岢岚县| 福鼎市| 凌云县| 利津县| 安顺市| 伊金霍洛旗| 福贡县| 望都县| 宾川县| 安陆市| 揭阳市| 务川| 肥东县| 平遥县| 库伦旗| 呼伦贝尔市| 双辽市| 马鞍山市| 江城| 师宗县| 灵宝市| 齐河县| 策勒县| 黑龙江省| 乃东县| 温泉县| 宝鸡市| 武安市| 蒙阴县| 天柱县| 舞钢市| 宜州市| 泾源县| 巢湖市| 贺兰县|