主要讨论默认的Serial/Serial Old内存分配:html
1. 对象优先在Eden分配;安全
通常状况下,对象会在新生代的Eden区分配,Eden区没有足够空间时,虚拟机会 发起一次MinorGC;当MinorGC时,若没法放入survivor空间,就会再经过分配担保机制转移到老年代中;post
2. 大对象直接进入老年代;url
经过 -XX:PretenureSizeThreshold参数设置;spa
3. 长期存活的对象进入老年代:htm
经过 -XX:MaxTenuringThreshold参数设置;每MinorGC一次还存活在Survivor中,则年龄加1;对象
4. 组团进入 老年代:blog
在survivor中年龄相同的全部对象大小总和大于 PretenureSizeThreshold 参数的一半,年龄大于或等于该年龄的对象进入老年代。生命周期
5. 空间担保进入 老年代:内存
每次MinorGC以前,会检查老年代最大连续可用空间是否大于 新生代全部对象的总空间,大于则表示安全可进行MinorGC;
若是小于:(JDK 6U24再也不检查HandlePromotionFailure,必定会冒险)
a. 检查HandlePromotionFailure 为 true ,表示容许冒险,则与历次晋升到老年代的对象平均大小比较,若大于则进行MinorGC,若小于则进行FullGC;
b. HandlePromotionFailure 为 false,进行FullGC;
MinorGC:指发生在新生代的GC,因大多数新生对象生命周期很短,因此MinorGC一般很频繁,回收速度也较快;
MajorGC/FullGC:指老年代GC,速度通常较慢,通常是MinorGC的10倍;一般MajorGC会伴随一次MinorGC;(书原话,有歧义)
参考知乎R大答案:Major GC和Full GC的区别是什么?触发条件呢?
触发条件:
MinorGC:Eden区满时触发;FullGC也会伴随有MinorGC;一般会使得Old gen变大;
FullGC:a. MinorGC触发前,检查历次进入老年代的平均大小,若小于则FullGC;
b. 若是有永久代(perm gen),在不足哆分配时,触发FullGC;
c. 调用System.gc(),提醒JVM FullGC,但不可控;
新生代分为:Eden Space、Survivor Space
老年代:Tenured Gen
永久代:Perm Gen(方法区相关数据);
在 JDK 1.8 中, HotSpot 已经没有 “PermGen space”这个区间了,取而代之是一个叫作 Metaspace(元空间) 的东西。