jvm 基礎(chǔ)篇-(2)- 對象分配及回收??(-XX:-HandlePromotionFailure、-XX:CMSInitiatingOccupancyFraction、-XX:MaxTenu...

對象分配規(guī)則

堆內(nèi)存:

image.png

分配策略:

1、jvm內(nèi)存宏觀分配策略
內(nèi)存宏觀分配策略
虛擬機(jī)棧分配<<<<<傳送門
2、堆內(nèi)分配策略
堆內(nèi)分配策略
1、對象優(yōu)先分配在Eden區(qū)。

?????如果Eden區(qū)沒有足夠的空間時(shí),虛擬機(jī)執(zhí)行一次Minor GC(Yong GC)。

2、大對象直接進(jìn)入老年代(大對象是指需要大量連續(xù)內(nèi)存空間的對象)。

?????這樣做的目的是避免在Eden區(qū)和兩個(gè)Survivor區(qū)之間發(fā)生大量的內(nèi)存拷貝(新生代采用復(fù)制算法收集內(nèi)存)。

3、長期存活的對象進(jìn)入老年代。

?????虛擬機(jī)為每個(gè)對象定義了一個(gè)年齡計(jì)數(shù)器,如果對象經(jīng)過了1次Minor GC那么對象會進(jìn)入Survivor區(qū),之后每經(jīng)過一次Minor GC那么對象的年齡加1,知道達(dá)到閥值對象進(jìn)入老年區(qū)。
-XX:MaxTenuringThreshold用來定義年齡的閾值。

4、動態(tài)判斷對象的年齡。

?????如果Survivor區(qū)中相同年齡的所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象可以直接進(jìn)入老年代。

5、空間分配擔(dān)保。

?????在發(fā)生Minor GC(Yong GC)之前,JVM會計(jì)算Survivor區(qū)移至老年區(qū)的對象的平均大小,虛擬機(jī)會檢查老年代最大可用的連續(xù)空間是否大于需要轉(zhuǎn)移的對象大小。
?????????? 如果大于,則此次Minor GC(Yong GC)是安全的。
?????????? 如果小于,jdk1.6之前:則虛擬機(jī)會查看HandlePromotionFailure設(shè)置值是否允許擔(dān)保失敗。如果HandlePromotionFailure=true,那么會繼續(xù)檢查老年代最大可用連續(xù)空間是否大于歷次晉升到老年代的對象的平均大小。
??????????????? 如果大于,則嘗試進(jìn)行一次Minor GC(Yong GC),但這次Minor GC(Yong GC)依然是有風(fēng)險(xiǎn)的,失敗后會重新發(fā)起一次Major GC(Full GC);
??????????????? 如果小于或者HandlePromotionFailure=false,則改為直接進(jìn)行一次Major GC(Full GC)。

但是在jdk1.6 update 24之后-XX:-HandlePromotionFailure 不起作用了,只要老年代的連續(xù)空間大于新生代對象的總大小或者歷次晉升到老年代的對象的平均大小就進(jìn)行MonitorGC,否則FullGC
jdk1.8下,HandlePromotionFailure會報(bào)錯(cuò),Unrecongnized VM option

?回收?:

什么樣的對象會被回收???
  • 引用計(jì)數(shù)法:


    循環(huán)引用問題
  • 可達(dá)性分析


    可達(dá)性分析
GC ROOT有哪些?
  • 虛擬機(jī)棧中本地變量表引用的對象。
  • 方法區(qū)中:
    • 類靜態(tài)變量引用的對象
    • 常量引用的對象
  • 本地方法棧中JNI(java native interface)引用的對象。(JNI:Navtive 方法是 Java 通過 JNI 直接調(diào)用本地 C/C++ 庫)
GC回收器清理對應(yīng)堆得區(qū)域
  • Young Generation(新生代):分為:Eden區(qū)和Survivor區(qū),Survivor區(qū)有分為大小相等的From Space和To Space。Eden區(qū)沒有足夠的空間時(shí),虛擬機(jī)執(zhí)行一次Minor GC
  • Old Generation(老年代): 當(dāng) OLD 區(qū)空間不夠時(shí), JVM 會在 OLD 區(qū)進(jìn)行 Old GC/Major GC。
內(nèi)存區(qū)域 回收算法 觸發(fā)回收條件 垃圾回收器 線程
Young Generation 復(fù)制算法 Eden區(qū)沒有足夠的空間時(shí) Minor GC / Young GC 單or多線程(可選擇)
Old Generation 標(biāo)記清除算法 Old使用達(dá)到CMS設(shè)置的閥值-XX:CMSInitiatingOccupancy
Fraction=70
Old GC/Major GC 單or多線程(可選擇)
Heap Generation Young Generation采用復(fù)制算法
Old Generation采用標(biāo)記整理算法
1、調(diào)用System.gc時(shí)。
2、老年代空間不足。
3、方法區(qū)空間不足。
4、Concurrent Mode Failure
CMS進(jìn)行回收過程中有大對象
要申請進(jìn)入Old區(qū)此時(shí)老年代空
間不足,就會報(bào)
Concurrent Mode Failure錯(cuò)誤,
同時(shí)觸發(fā)fullgc。
5、Minor GC后進(jìn)入老年代對象
對象占用空間大小大于老年代的
可用內(nèi)存。
6、執(zhí)行 jmap -histo:live or
jmap -dump:live
Full GC 單線程
常見GC
  • Minor GC/Young GC:新生代GC,指發(fā)生在新生代的垃圾收集動作,因?yàn)閖ava對象大多都具備朝生夕死的特性,所以Minor GC非常頻繁,一般回收速度也比較快。>>>>>復(fù)制算法 <<<<<傳送門

  • Old GC/Major GC:收集整個(gè)Old gen的GC,只有CMS模式這么稱呼。MajorGC的速度一般比Minor GC慢10倍以上。

  • Full GC:收集整個(gè)堆,包括Young gen、Old gen、Perm gen(如果存在的話)等所有部分的模式?;页B蟸

  • Mixed GC:收集整個(gè)young gen以及部分old gen的GC。只有G1模式這么稱呼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容