天天看點

Java的一些概念

最近抽空看了一些簡單的概念

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.标記整理算法,與第二個差別在于回收未被引用的對象時候,會将後面的對象進行移動

清除和壓縮的動作就是整理