JVM內存管理和垃圾回收 原

JVM內存管理和垃圾回收

 

JVM內存模型其實就是JVM在運行程序時的一個內存分佈情況,主要分一下幾個區域:

1.PC寄存器:

    用於存儲每個線程下一步將執行的JVM指令,native方法則PC寄存器中不存儲任何信息。

 

2.JVM棧:

    JVM棧是線程私有的,每個線程創建的同時都會創建JVM棧,JVM棧中存放的爲當前線程中局部基本類型的變量(java中定義的八種基本類型:boolean,char,byte,short,int,long,float,double)部分的返回結果以及Stack Frame,非基本類型的對象在JVM棧上僅存放一個指向堆上的地址。

 

3.JVM堆:

    它是JVM用來存儲對象實例以及數組值的區域,可以認爲Java中所有通過new創建的對象的內存都在此分配。我們常說的GC內存回收就是這部分內存。堆空間爲新生代和老年代。

 

3.1新生代

    新生代又分爲一個Eden區和兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被複制到另外一個Survivor區,當這個Survivor也滿了的時候,從第一個Survivor區複製過來的並且此時還存活的對象,將被複制年老區。需要注意,兩個Survivor是交替使用的,也就是說Survivor總有一個是空的。

 

3.2老年代

    大對象直接分配在老年代 ,老年代存放從新生代存活的對象。一般來說老年代存放的都是生命期較長的對象。。

 

4.方法區(持久代)

    方法區域存放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義爲final類型的常量、類中的Field信息、類中的方法信息,當開發人員在程序中通過Class對象中的getName、isInterface等方法來獲取信息時,這些數據都來源於方法區域,同時方法區域也是全局共享的,在一定的條件下它也會被GC,當方法區域需要使用的內存超過其允許的大小時,會拋出OutOfMemory的錯誤信息。例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。

 

5.運行時常量池

    存放的爲類中的固定的常量信息、方法和Field的引用信息等,其空間從方法區域中分配。

 

6.本地方法棧

    JVM採用本地方法堆棧來支持native方法的執行,此區域用於存儲每個native方法調用的狀態。

 

JVM內存回收策略

垃圾收集器

 

Serial:

    最基本也是歷史最悠久的收集器,新生代垃圾收集器,

    單線程stop the world until garbage collecting end.

    它是client模式下默認的新生代垃圾收集器,無線程交互,簡單而高效

    採用複製算法

 

ParNew:

    相當於是Serial收集器的多線程版本,其他的絕大多數特性與Serial收集器相同。

    server模式下首選的新生代收集器

    目前只有Serial和ParNew能與CMS收集器配合

 

Parallel Scavenge:

    新生代,複製算法,並行多線程收集器

    目標爲達到一個可控制的吞吐量:

    吞吐量=用戶代碼運行時間/(用戶代碼運行時間+垃圾收集時間)

    主要適合在後臺運算而不需要太多交互的任務

    參數: -XX:GCTimeRatio 設置吞吐率大小的參數

                -XX:MaxGCPauseMillis設置最大垃圾收集停頓時間

                -XX:UseAdaptiveSizePolicy打開gc自適應調節策略

 

Serial Old:

    老年代收集器,單線程,標記整理算法

    主要用於client模式下

    主要用途:1.在jdk1.5及之前的版本中與Parallel Scavenge搭配使用

                      2.作爲CMS收集器的後備預案

 

Parallel Old:

    Parallel Scavenge的老年代版本,多線程,標記整理算法,吞吐量優先

 

CMS:

    以最短回收時間爲目標,標記清除算法

    分4個過程:初始標記,併發標記,重新標記,併發清除;其中,初始標記和重新標記需 要stop the world。併發標記和併發清除耗時較長,但是可以與用戶線程一起併發執行。

    缺點:併發的同時也意味着會佔用cpu資源,導致吞吐率下降

               標記清除算法會導致大量的空間碎片(導致分配大對象時沒有足夠大的連續空間,導致提前full gc)

 

Full GC條件:

1.老年代空間不足(過多對象由新生代轉入老年代,在老年代創建大對象和大數組),Full GC後仍不足,則拋出OOM異常

2.永久代存放過多class信息,系統加載的類反射的類和調用的方法較多時,不足以存放新的class或反射類或動態代理生成的類信息時

3.當老年代中的連續空間不足以存放Minor GC時,從新生代晉升到老年代的對象時。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章