首页 > 代码库 > Java内存分配策略
Java内存分配策略
主要讨论默认的Serial/Serial Old内存分配:
一、几种分配方案
1. 对象优先在Eden分配;
一般情况下,对象会在新生代的Eden区分配,Eden区没有足够空间时,虚拟机会 发起一次MinorGC;当MinorGC时,若无法放入survivor空间,就会再通过分配担保机制转移到老年代中;
2. 大对象直接进入老年代;
通过 -XX:PretenureSizeThreshold参数设置;
3. 长期存活的对象进入老年代:
通过 -XX:MaxTenuringThreshold参数设置;每MinorGC一次还存活在Survivor中,则年龄加1;
4. 组团进入 老年代:
在survivor中年龄相同的所有对象大小总和大于 PretenureSizeThreshold 参数的一半,年龄大于或等于该年龄的对象进入老年代。
5. 空间担保进入 老年代:
每次MinorGC之前,会检查老年代最大连续可用空间是否大于 新生代所有对象的总空间,大于则表示安全可进行MinorGC;
如果小于:(JDK 6U24不再检查HandlePromotionFailure,一定会冒险)
a. 检查HandlePromotionFailure 为 true ,表示允许冒险,则与历次晋升到老年代的对象平均大小比较,若大于则进行MinorGC,若小于则进行FullGC;
b. HandlePromotionFailure 为 false,进行FullGC;
二、MinorGC 与MajorGC
MinorGC:指发生在新生代的GC,因大多数新生对象生命周期很短,所以MinorGC通常很频繁,回收速度也较快;
MajorGC/FullGC:指老年代GC,速度一般较慢,一般是MinorGC的10倍;通常MajorGC会伴随一次MinorGC
三、HotSpot几个区域
新生代分为:Eden Space、Survivor Space
老年代:Tenured Gen
永久代:Perm Gen(方法区相关数据)
Java内存分配策略