内存分配策略

来源:互联网 发布:电脑无法连接网络wifi 编辑:程序博客网 时间:2024/06/05 11:01

jvm给新生对象分配内存,从大方向来说,一般直接分配在Eden区。如果开启了本地线程缓冲区,会按照线程优先分配在TLAB

Thread Local Allocation Buffer。少数情况下会将对象直接分配到老年代。


分配规则并不是一成不变。主要取决于垃圾收集的组合方式以及jvm参数设置。


以Serial和SerialOld为例说明分配策略,其他组合需要自行测试:

一般新生对象直接分配到Eden区,当剩余空间不够分配时会进行一次Minor GC(针对新生代的回收,速度是Major GC--Full GC的10倍以上)

Minor GC先检查存活对象是否能分配到Survivor区,如果Survivor空间不够,通过分配担保机制把存活对象转移到老年代去。给新生对象挪地儿。


大对象会直接进入老年代。判断一个对象是否大对象可以用参数控制:-XX:PretenureSizeThreshold 这里要写详细的bite数不能用MB之类的

如果新生对象大小大于这个值就可以直接进入老年代。

长期存活对象会进入老年代。判断一个对象是否长期存活,是看这货熬过几轮Minor GC,熬过一轮就加1,最终如果超过默认的或者设置过的

参数:MaxTenureThreshold (默认15)。年龄一旦超过这个值,就会进入老年代


如果生成了大量的年轻对象,没有达到MaxTenureThreshold的年龄限制,又占用了很多Survivor区的空间呢?会进行动态年龄判定。

假设当前年龄为X的对象所占Survivor空间大于等于一半,那么这些对象直接晋升为老年代


空间分配担保:在进行Minor GC之前,jvm会先检查老年代中的最大连续可用内存是否大于新生代的对象大小总和。如果大于,进行Minor GC

被视为无风险。如果小于,就会去检查是否有HandlePromotionFailure设置允许担保失败,如果允许,就尝试进行Minor GC,如果失败,Full GC

如果HandlePromotionFailure不允许担保失败,就直接Full GC。


模拟分配和回收如下:

...Obj obj = new Obj();
JavaHeapSize = 100%;
YoungGenerationSize ySize = 50%;//假设新生代堆大小占比 -Xmn
OldGenerationSize oSize = 50%;//老年代
EdenSize e = 80% in ySize;
Survivor s1 = 10% in ySize;
Survivor s2 = 10% in ySize;
//对象分配(没有包含动态年龄判定部分)
PretenureThreshold pt = 123456 bit; //大对象判定条件if(obj.size > pt<span style="font-family: Arial, Helvetica, sans-serif;">){</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span>obj直接去老年代</span>
}else{
    obj去新生代 Eden区 //bump the pointer or FreeList<span style="white-space:pre"></span>
}
//回收时:
Minor GC();//较频繁的回收新生代空间
Boolean HandlePromotionFailure hf; //是否允许分配担保失败
if(oSize.可用空间 > ySize.存活对象大小){
<span style="white-space:pre"></span>Minor GC;
<span style="white-space:pre"></span>执行复制算法,
}else{
<span style="white-space:pre"></span>if( hf == true){
<span style="white-space:pre"></span>尝试Minor GC;
<span style="white-space:pre"></span>if(fail){
<span style="white-space:pre"></span>Full GC;
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}else{
<span style="white-space:pre"></span>Full GC;
<span style="white-space:pre"></span>}
}


0 0
原创粉丝点击