对象的内存分配,大方向上是在对上分配(也可能经过JIT编译后拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区,如果启动了本地线程分配缓冲(TLAB),将按线程优先分配在TLAB上。少数情况下直接分配在老年代。
Serial、Serial Old收集器下:
对象优先在Eden区分配,当Eden区没有足够的空间进行分配时,将发起一次Minor GC。
-XX:PrintGCDetails
--收集日志参数,在垃圾收集时打印内存回收日志,且在进程退出时输出当前的内存各区域分配情况。
大对象(大量连续内存空间的对象,例很长的字符串以及数组)直接进入老年代。
-XX:PretenureSizeThreshold
--令大于这个设置值的对象在老年代分配。只对Serial和ParNew生效。
长期存活对象进入老年代。
虚拟机给每个对象定义一个对象年龄器。在Eden
的对象,在经过第一次Minor GC后仍然存在,并且可被Survivor
容纳的话,将被移动到Survivor空间中,对象年龄设为1。每熬过一次Minor GC,年龄+1。
-XX:MaxTenuringThreshold
--对象晋升老年代的年龄阈值。默认为15。
Survivor空间中相同年龄所有对象大小总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到
MaxTenuringThreshold
中要求的年龄。
Minor GC之前,虚拟机先检查老年代最大可用的连续空间是否大于新生代所有对象空间之和。如果不大于且
HandlePromotionFailure
允许担保的话,会继续查看老年代最大可用的连续空间是否大于晋升到老年代对象的平均大小,如果大于则进行Minor GC。否则进行Full GC。
JDK 1.6 Update 24之后,HandlePromotionFailure失效。