(四)内存分配与回收策略

#内存分配与回收策略 #

  1. 一般情况对象分配在新生代的eden区,当eden区没有足够的内存进行分配时,虚拟机将发起一次minor GC(新生代GC)
  2. 大对象直接进入老年代;虚拟机提供了一个参数-XX:pretenureSizeThreshold,当创建的对象大于该阀值,该对象将直接在老年代分配(目的:避免eden区和两个survivor区大量的复制操作);注意:该参数只对serial和parNew虚拟机有用
  3. 长期存活的对象进入老年代;(eden区创建分配的对象,经过第一次Minor GC仍然活着并且survivor区可以容纳,就将复制到survivor区并且对象年龄设定为1,对象在survivor区内没经过Minor GC并且活着,该值就加1,当对象年龄大于-XX:MaxTenuringThreshold设定值(默认为15)时,该对象就将进入老年代
  4. 动态对象年龄判断。虚拟机并不是一味要求满足对象年龄达到MaxTenuringThreshold才进入老年代,如果在survivor区中相同年龄的对象总大小大于其内存的一半,年龄大于或者等于该年龄的对象将直接进入老年代无需等到MaxTenuringThreshold指定的年龄;
  5. 空间分配担保(在Minor GC前,会检查老年代最大可用的连续空间是否大于新生代所有对象的总大小,大于则Minor GC;小于则查看HandlePromotionFailure参数是否允许担保失败,如果不允许,则进行一次Full GC如果允许,继续检查老年代最大可用连续空间是否大于之前历次晋升到老年代对象的平均大小,如果大于则进行Minor GC,否则进行一次FUll GC)

注意:Jdk 6 update24以后HandlePromotionFailure参数不在影响空间分配担保,而是只要当老年代最大连续可用空间大于新生代对象总大小或者历次晋升老年代对象的平均大小就会进行Minor GC,否则进行Full GC;

minor GC与Full GC

Minor gc:指发生在新生代的垃圾收集动作,特点:Minor GC 频繁,回收快
Full GC/Major GC:指发生在老年代的垃圾收集动作

你可能感兴趣的:(Java虚拟机,Java虚拟机)