JVM---内存分配策略

来源:互联网 发布:java怎么写日志 编辑:程序博客网 时间:2024/06/05 07:44

普遍的内存分配规则

1.对象优先在Eden区分配,当Eden区没有足够空间时,将发起一次Minor GC。
  新生代GC(Minor GC):指发生在新生代的垃圾收集动作,非常频繁,回收速度也较快。
  老年代GC(Major GC/Full GC): 指发生在老年代的GC,经常伴随至少一次的Minor GC,速度比Minor GC慢10倍以上

2.大对象直接进入老年代
  所谓大对象是指,需要大量连续内存空间的java对象,最典型的就是很长的字符串以及数组,

3.长期存活的对象进入老年代
  虚拟机给每个对象定义一个对象年龄计数器。如果对象在Eden出生并经过第一次Minor GC后依然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,然后对象年龄设为1,对象在Survivor区中每熬过一次Minor GC,年龄就增加1,当年龄增加到一定程度时(默认为15),就会晋级老年代。

4.动态对象年龄判定。

5.空间分配担保。 
  在发生Minor GC前,虚拟机会先检查老年代最大可用的连续空间是否大于新手代所有对象总空间,若成立则Minor GC。 若不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,若允许,那么继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,若大于,将尝试进行一次Minor GC ;若小于,或者不允许担保失败,那么这是要改为Full GC。