首页 > 代码库 > 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内存分配策略