JDK的結構體系

首先要搞清楚JRE是Java程式運作環境,而JRE最基礎的就是JVM,JDK是包含了JRE和其他的一些基本類庫。
JVM整體架構
當你在不同系統下載下傳安裝JDK時,Oracle會讓你選擇系統的版本,這就是JVM從軟體層面屏蔽了不同作業系統在底層硬體與指令上的差別
JVM記憶體模型
類裝載器子系統
就相當于是快遞員,它将.class檔案進行裝載、驗證(每個class檔案在開頭有特定的檔案辨別:cafe babe)、準備、解析、初始化,然後将建立好的對象送到運作時資料區(記憶體中)。
運作時資料區(記憶體模型)
隻有把這塊搞懂了才能進行調優
棧(線程)
棧是線程獨有的,每個線程都會單獨配置設定一塊棧記憶體空間,它會存放局部變量等。
棧幀:
線程中一個方法對應一塊棧桢區域,當方法調用完之後會将棧桢區域進行釋放。棧的結構與資料結構中的棧類似,元素都是先進後出(FILO),方法的嵌套調用與棧這種資料結構是非常契合的。
使用javap指令将位元組碼檔案進行反彙編為JVM指令碼檔案,再對應Orcale官方的指令碼檔案 Oracle官網位址
- 局部變量表:用來存放局部變量,對象形式的局部變量存儲的是指向堆内 存對象的記憶體位址
- 操作數棧:用來存放代碼運作過程中臨時的操作數
- 動态連結:
- 方法出口:存放方法在調用者的位置,友善方法執行完成後回到調用者對應的位置繼續向下執行其他代碼。
程式計數器
線程獨有,用來存儲目前線程正在運作的那行代碼的位置
當CPU資源被搶占,線程挂起,得到CPU的資源後的線程之是以可以繼續運作是因為有程式計數器記錄了代碼運作的位置,線程中每執行一行代碼位元組碼執行引擎都會動态修改程式計數器的值
方法區(元空間)
線程共享,JDK1.8之前叫永久代,JDK1.8之後叫元空間
最大的差別是:永久代使用的是JVM的堆記憶體,元空間并不在虛拟機中而是使用本機實體記憶體。
主要存放:常量,靜态變量,類資訊
位元組碼檔案通過類加載器将類的元素資訊放到方法區
靜态變量如果是對象的話,也存儲的是對象在堆記憶體中的位址
本地方法棧
線程獨有,存儲本地方法
堆
線程共享
堆記憶體占比:
- 年輕代:1/3
- 伊甸園區:8/10
- Survivor區:2/10
- 老年代:2/3
GC 分析
- minor gc: 當伊甸園區放滿對象之後就會觸發 minor gc,通過複制算法會将存活的對象放到Survivor區,通過每次觸發minor gc對象在Survivor區來回複制會增加分代年齡,當分代年齡達到15次,會将對象挪到老年代
-
可達性分析算法:将GC Roots對象作為起點,從這些節點開始向下搜尋引用對象,找到的對象都标記為 非垃圾對象,其餘未标記的都是垃圾對象
GC Roots根節點:線程本地變量、靜态變量、本地方法棧的變量等等
JVM性能調優與底層原理分析(學習筆記)JDK的結構體系JVM整體架構JVM記憶體模型 - 對象頭
JVM性能調優與底層原理分析(學習筆記)JDK的結構體系JVM整體架構JVM記憶體模型 - 監控工具:jvisualvm
- full gc:當老年代的對象存儲滿了之後會觸發,會回收整個堆和方法區
調優
- STW :Stop-The-World ,停止掉使用者的線程,當位元組碼執行引擎執行minor gc或者是full gc時會stw,調優的目的就是減少stw
實戰調優
- 估算對象的大小,可以參考Java中變量大小,假定這個業務中訂單對象為1kb
- 估算每秒大概産生多少訂單,假定這個業務每秒産生300單,就是每秒産生300個訂單對象,也就是300kb
- 下單還可能涉及其他對象,将每秒産生的對象放大20倍,就是(20*300)kb/s,每秒産生6M對象
- 同時還可能産生訂單查詢等其他操作,再放大10倍,就是(2030010)kb/s,每秒産生60M對象
- 估算多久會發生minor gc,此時就會産生STW
- 當Survivor區的對象占比超過Sucvivor區容量的50%的時候,對象會直接放到老年代(對象動态年齡判斷)
- 判斷什麼時候會發生full gc
- 調整堆記憶體中的參數配置設定,使其盡量不發生gc
JVM性能調優與底層原理分析(學習筆記)JDK的結構體系JVM整體架構JVM記憶體模型 調優後的變化JVM性能調優與底層原理分析(學習筆記)JDK的結構體系JVM整體架構JVM記憶體模型 JVM性能調優與底層原理分析(學習筆記)JDK的結構體系JVM整體架構JVM記憶體模型
要對業務中類的模型分析清楚,了解JVM配置設定機制
此篇文章僅僅抛磚引玉,道阻且長,你我共同努力