柚子快報邀請碼778899分享:JVM之垃圾回收機(jī)制
柚子快報邀請碼778899分享:JVM之垃圾回收機(jī)制
一、常量池的位置
?方法區(qū)和永久代以及元空間是什么關(guān)系呢? 方法區(qū)和永久代以及元空間的關(guān)系很像 Java 中接口和類的關(guān)系,類實(shí)現(xiàn)了接口,這里的類就可以看作是永久代和元空間,接口可以看作是方法區(qū),也就是說永久代以及元空間是 HotSpot 虛擬機(jī)對虛擬機(jī)規(guī)范中方法區(qū)的兩種實(shí)現(xiàn)方式。并且,永久代是 JDK 1.8 之前的方法區(qū)實(shí)現(xiàn),JDK 1.8 及以后方法區(qū)的實(shí)現(xiàn)變成了元空間
二、 堆的結(jié)構(gòu)
演變
?
永久代中存啟動類依賴的java類,不存在垃圾回收,關(guān)閉jvm才會回收內(nèi)存。?
打印堆結(jié)構(gòu)
-XX:+PrintGCDetails
三、堆中存放對象的規(guī)則?
1. 對象優(yōu)先分配在Eden伊甸園區(qū),如果Eden沒有空間了會發(fā)動一次Minor GC。
2.大對象會優(yōu)先存放在老年代,目的是減少垃圾回收的成本。實(shí)際上大對象存放在老年區(qū)是由jvm參數(shù)動態(tài)決定的。
G1回收器中:
-XX:G1HeapRegionSize //設(shè)置堆區(qū)域的大小
-XX:G1MixedGCLiveThresholdPercent//設(shè)置閾值絕對對象直接進(jìn)入老年代
3.長期存活的對象將進(jìn)入老年代
一般情況下,對象在剛誕生時會引入Eden區(qū),在經(jīng)歷一次Minor GC后如果仍然可以存活將進(jìn)入幸存區(qū),并設(shè)置對象的年齡為1。對象每熬過一次MinorGC后年齡就增加1。
hotspot將所有對象的年齡從小到大進(jìn)行排序,并將年齡進(jìn)行加和,當(dāng)加到某個對象年齡后,超過幸存區(qū)所有對象年齡和的50%時(這個百分比可以自設(shè))。取這個對象的年齡和設(shè)置的晉升老年代年齡的閾值取其小的一個作為新的晉升老年代閾值。
設(shè)置幸存區(qū)晉升老年區(qū)閾值:
-XX:MaxTenuringThreshold
設(shè)置晉升老年代。幸存區(qū)對象年齡超過的百分比
-XX:TargetSurvivorRatio=percent
四、那些對象可以回收?
1.引用計數(shù)法
為每個對象分配一個計數(shù)器,當(dāng)有引用時,計數(shù)器+1。當(dāng)引用失效時,計數(shù)器-1。當(dāng)計數(shù)器為0時,說明這個對象就是垃圾了。
局限:對象如果循環(huán)引用,計數(shù)器就永遠(yuǎn)不是0.
2.可達(dá)性分析算法
通過一系列的稱為 “GC Roots” 的對象作為起點(diǎn),從這些節(jié)點(diǎn)開始向下搜索,節(jié)點(diǎn)所走過的路徑稱為引用鏈,當(dāng)一個對象到 GC Roots 沒有任何引用鏈相連的話,則證明此對象是不可用的,需要被回收。
哪些對象可以作為 GC Roots 呢?
虛擬機(jī)棧(棧幀中的局部變量表)中引用的對象本地方法棧(Native 方法)中引用的對象方法區(qū)中類靜態(tài)屬性引用的對象方法區(qū)中常量引用的對象所有被同步鎖持有的對象JNI(Java Native Interface)引用的對象
?被確定為可回收的對象“非死不可”嗎?
被判定為垃圾的對象還要經(jīng)歷兩次標(biāo)記才會被回收,第一次標(biāo)記:可達(dá)性算法判定不可達(dá)。還有進(jìn)行一次條件判斷和一次篩選。當(dāng)這個對象沒有覆蓋finalize?方法,或者已經(jīng)調(diào)用過了finalize?方法時,虛擬機(jī)判斷沒有必要執(zhí)行finalize?方法。第二次標(biāo)記:除非待回收的對象和引用鏈上的對象關(guān)聯(lián),否則就會被回收。
五、怎么進(jìn)行回收?(算法)
1.標(biāo)記清除算法
標(biāo)記出不需要回收的對象(根據(jù)可達(dá)性分析),將沒有標(biāo)記的對象進(jìn)行回收。
問題:標(biāo)記清除這個過程效率不高;會產(chǎn)生大量的內(nèi)存碎片。
2.復(fù)制算法
將內(nèi)存分成兩塊,只使用一半。將使用的一半中保留的對象復(fù)制到?jīng)]使用的那一半。然后清空使用著的這一塊。
問題:可用內(nèi)存空間變小,對于存活對象數(shù)量的的老年代不適合(成本高效率低)。
3.標(biāo)記整理算法
適合老年代,現(xiàn)將對象標(biāo)記,然后將存活的對象向一端移動,并將界限以外的對象清理掉。
4.分代收集算法:
現(xiàn)代的虛擬機(jī)多采用分代收集算法,按照新生代和老年代的特點(diǎn)選擇合適的回收算法。例如新生代存在大量的垃圾回收,因此采用復(fù)制算法。老年代因?yàn)闆]有額外的內(nèi)存空間分配擔(dān)保,采用標(biāo)記清除算法或者標(biāo)記整理算法。
柚子快報邀請碼778899分享:JVM之垃圾回收機(jī)制
好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。