最近抽空看了一些簡單的概念
1.OpenJDK
是一個開源項目,
内容主要是定義了Java平台的Java規範,JSR,JEP.
同時提供了Java SE的所有類的源代碼實作,例如java.lang,java.util,java.time等
它還提供了jvm概念的部分實作HotSpot
擁有者:OpenJDK做為GPL許可(GPL-licensed)的Java平台的開源化實作,Sun正式釋出它已經六年有餘
2.HotSpot
解決的問題或者設計初衷:
在嵌入式等環境中,因為記憶體和cpu基本上無法完成繁瑣複雜的編譯過程
是以需要将源代碼編譯成指定環境的機器碼。
Java提供了一個思路,就是位元組碼。
位元組碼是優化好的能夠在低性能嵌入式跑的統一的進階機器碼
但是它畢竟不是機器碼,如何讓機器或者cpu可以識别,運作
就需要轉換,JVM就是做這個的。
但是将指令翻譯稱主機CPU可以實際執行的指令集也是一個耗時的過程,
就可以将位元組碼進一步編譯和緩存,比在解釋器中運作更加快,這就是JIT(即時編譯)
HotSpot就是即時編譯的一種實作;肯定有别的實作,比如OpenJ9
3.HotSpot的基本概念和内容
3-1結構
在優化
1、類檔案
class檔案
2、Class Loader SubSystem(類加載子系統),加載1,由1單向進入2
這個在Spring或者jdk的resources中也有類似的概念,實作肯定不一樣,面向的對象不同,思路是可以借鑒的
3.Runtime Data Area(運作時資料區域)與2進行互動,有來有往
包括幾個子產品:Method Area,Heap ,Java Thread, Program Counter Register,Native Internal Threads
4.Execution Engine(執行引擎),與3進行互動,有來有往
包括幾個子產品:JIT Compiler , Garbage Collector
5.Native Method Interface ----- Native Method Libraries(本地方法接口和庫)
與Runtime Data Area有互動,與Execution Engine也有互動
3-2解釋部分結構
3-2-1 Heap,也就是堆
heap分為三代,進行分代管理
Young Generation , Old Generation ,Permanent Generation
按照建立對象的時間,先出現在Young Generation;
如果經過15次垃圾回收,它還在Young Generation,就會晉升為Old Generation;
隻有不受垃圾回收控制的部分,比如本地接口調用的資料一般放在Permanent Generation;
注:Young Generation細分了三個區域:Eden,S0,S1
3-3 記憶體回收,TLAB
每個對象建立的時候,都會在記憶體中申請空間;必須對記憶體管理
Oracle基于提高配置設定效率,提出一種機制,叫TLAB
Thread Local Allocation Buffers
它會對Eden區域進行劃分,與線程數量一緻的子區域,每個區域配置設定到一個線程裡
每個線程在自己的區域内管理記憶體,除了線程之外的記憶體空間在何用處?
就是為了線上程使用完目前記憶體區域,就可以在這一塊連續的記憶體區域進行重新申請新的記憶體
這樣的話,這個線程就會關聯兩個TLAB,它就會有很多Buffers,使用線程的Free_list來管理即可
3-4 垃圾回收算法
目前接觸到的一般思路就是三種:
1.複制算法
2.标記清楚算法
3.标記整理算法,也叫标記清除壓縮算法
1.複制算法主要用于Eden,s0,s1之間
複制的基本思路就是将存活的對象從一個空間複制到另一個空間;
Oracle為了解決顯而易見的50%使用率問題,就将空間分為3個塊,複制時候,并不是等價複制到
另一個記憶體中,是把Eden和s0中存貨的對象複制到s1中,如果s1裝不下,就會把一些晉升到Old
這種方式就很大提高了記憶體使用率
效果不錯,主要是很多對象存貨不久,也就是一塊記憶體回收後,本身占用量低
2.标記清除算法,也就是會有算法,對不同對象是否被引用,進行識别和定位
不是一個個周遊
将這些未被引用的清除,很自然就會産生不連貫的記憶體區域,這就是記憶體碎片
3.标記整理算法,與第二個差別在于回收未被引用的對象時候,會将後面的對象進行移動
清除和壓縮的動作就是整理