1、YGC做了哪些操作
Eden區(qū):
1)對(duì)象回收
2)存活對(duì)象 被復(fù)制到 Survivor區(qū)的"To"(age不加1)
Survivor的From:
(3)對(duì)象回收
存活對(duì)象
4)不滿足年齡條件的被復(fù)制到 Survivor區(qū)的“To”(age加1)
5)滿足年齡條件的移入年老代
2、GC中的一些點(diǎn)
1、Minor GC會(huì)一直重復(fù)這樣的過(guò)程,直到"To"區(qū)被填滿,會(huì)將所有對(duì)象移動(dòng)到年老代中。
2、動(dòng)態(tài)判斷對(duì)象的年齡。如果Survivor區(qū)中相同年齡的所有對(duì)象大小的總和大于Survivor空間的一半,
年齡大于或等于該年齡的對(duì)象可以直接進(jìn)入老年代。
3、空間分配擔(dān)保。每次進(jìn)行Minor GC時(shí),JVM會(huì)計(jì)算Survivor區(qū)移至老年區(qū)的對(duì)象的平均大小,
如果這個(gè)值大于老年區(qū)的剩余值大小則進(jìn)行一次Full GC,如果小于檢查HandlePromotionFailure設(shè)置,
如果true則只進(jìn)行Monitor GC,如果false則進(jìn)行Full GC。
4、當(dāng)使用G1,CMS 時(shí),F(xiàn)ullGC發(fā)生的時(shí)候 是 Serial+SerialOld。
當(dāng)使用ParalOld時(shí),F(xiàn)ullGC發(fā)生的時(shí)候是 ParallNew +ParallOld.
3、JVM參數(shù)
-XX:NewSize 設(shè)置年輕代的初始大小
-XX:MaxNewSise 設(shè)置年輕代的最大值
建議設(shè)為整個(gè)堆大小的1/3或者1/4,兩個(gè)值設(shè)為一樣大。
-XX:SurvivorRatio
設(shè)置Eden和其中一個(gè)Survivor的比值,默認(rèn)是8比1。
-Xmx 堆的最大值;
-Xms 堆的最小值;
兩個(gè)值最好設(shè)置為相等。
-XX:+PrintTenuringDistribution
用于顯示每次Minor GC時(shí)Survivor區(qū)中各個(gè)年齡段的對(duì)象的大小。
-XX:MaxTenuringThreshold和-XX:InitialTenuringThreshold
用于設(shè)置Survivor區(qū)對(duì)象晉升年老代中年齡的最小值和最大值
-XX:NewRatio=1
修改新生代和老年代之間的內(nèi)存比例;
4、1.6、1.7、1.8關(guān)于永久代的變化
移除永久代的工作從JDK1.7就開(kāi)始了。JDK1.7中,存儲(chǔ)在永久代的部分?jǐn)?shù)據(jù)就已經(jīng)轉(zhuǎn)移到了Java Heap或者是 Native Heap。
但永久代仍存在于JDK1.7中,并沒(méi)完全移除,譬如符號(hào)引用(Symbols)轉(zhuǎn)移到了native heap;
字面量(interned strings)轉(zhuǎn)移到了java heap;類的靜態(tài)變量(class statics)轉(zhuǎn)移到了java heap。
static String base = "string";
public static void main(String[] args) {
List list = new ArrayList();
for (int i=0;i< Integer.MAX_VALUE;i++){
String str = base + base;
base = str;
list.add(str.intern());
}
}
JDK 1.6 的運(yùn)行結(jié)果:PG SPACE
JDK 1.7 的運(yùn)行結(jié)果:java.lang.OutOfMemoryError: Java heap space
JDK 1.8 的運(yùn)行結(jié)果:java.lang.OutOfMemoryError: Java heap space
可以大致驗(yàn)證 JDK 1.7 和 1.8 將字符串常量由永久代轉(zhuǎn)移到堆中。
5、Metaspace(元空間)
無(wú)