Java虛擬機(筆記)

MinorGC的過程:

1.eden、SurvivorFrom複製到SurvivorTo,年齡加1。

首先,當Eden區滿的時候會觸發第一次GC,把還活着的對象拷貝到SurvivorFrom區,當Eden區再次觸發GC的時候會掃描到Eden區和From區域,並對這兩個區域進行垃圾回收,經過這次回收後還存活的對象,則直接複製到To區域(如果有對象的年齡達到了老年的標準,則賦值到老年代區),同時把這些對象的年齡加1。

2.清空Eden、SurvivorFrom。

然後,清空Eden和SurvivorFrom中的對象,也即複製之後又交換,誰空誰是to。

3.SurvivorTo和SurvivorFrom互換。

最後,SurvivorTo和SurvivorFrom互換,原SurvivorTo成爲下一次GC時的SurvivorFrom區,部分對象會在From和To區域中複製來複制去如此交換了15次(由JVM參數MaxTenuringThreshold決定,這個參數默認是15),最終如果還是存活,就存入老年代。

 

可達性分析(GC Root):

爲了解決引用計數法的循環引用的問題,Java使用了可達性分析的方法。所謂“GC Roots"或者說tracing GC的”根集合”就是一組必須活躍的引用。基本思路就是通過一系列名爲:“GC Roots”的對象作爲起始點,從這個被稱爲GC Roots的對象開始向下搜索,如果一個對象到GC Roots沒有任何的引用鏈時,則說明此對象不可用。也即給的一個集合的引用作爲根出發,通過引用關係遍歷對象圖,能夠被遍歷到的對象被判定爲存活,沒有遍歷到的被自然被判定爲死亡。

能夠作爲GC Roots的對象:1.虛擬機棧(棧幀中的局部變量區,也叫做局部變量表)中引用的對象。2.方法區中的類靜態屬性引用的對象。3.方法區中常量引用的對象。4.本地方法棧中JNI(Native方法)引用的對象。

 

JVM的參數類型:

1.標配參數。2.x參數。3.xx參數。

1.Boolean類型:公式:-XX:+或者-某個屬性值,+表示開啓,-表示關閉。如:-xx:+printGCDetails表示開啓了輸出GC細節。

2.KV設置類型:公式:-XX:屬性key=屬性值value,例如:-XX:MetaspaceSize=128m;-XX:MaxTenuringThreshold=15;

 

元空間和永久代:

在Java8中,永久代已經被移除,被一個稱爲元空間的區域所取代。元空間的本質和永久代類似。

元空間(Java8)與永久代(Java7)之間最大的區別在於:永久代使用JVM的堆內存,但是Java8以後的元空間並不在虛擬機中,而是使用本機物理內存。

因此默認情況下,元空間的大小僅受本地內存限制,類的元數據放入native memory,字符串池和類的靜態變量放入Java堆中,這樣可以加載多少類的元數據就不再由MaxPermiSize控制,而由系統的實際可用空間控制。

 

 

 

 

 

 

 

 

 

 

 

筆記來源:尚硅谷

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