Java虚拟机内存分配与回收策略

1、大多情况下,对象在新生代eden区分配,当eden区内存不足时,虚拟机触发一次minor GC。

2、大对象直接进入老年代。避免在eden区和两个survivor区之间发生大量内存复制。

3、长期存活的对象进入老年代。虚拟机为每一个对象定义了年龄计数器。如果对象在eden区出生并经历第一次minor GC后仍然存活,并且能被survivor容纳,将被复制到survivor区,并将年龄设为1。对象在survivor区每熬过一次minor GC,对象的年龄就加1。当对象的年龄增加到15(默认)时,就会晋升到老年代。

4、动态年龄判定。虚拟机并不是永远要求对象年龄达到15才能晋升到老年代。如果survivor 区相同年龄的所有对象占用的总空间超过了survivor总容量的一半,则年龄大于等于该年龄的所有对象直接晋升到老年代。

5、空间分配担保。在minor GC前,虚拟机会先检查老年代最大可用连续空间是否大于新生代所有对象总大小,如果成立,minor GC确保是安全的。如果不成立,则继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小。如果大于,则尝试minor GC,如果小于,则进行一次full GC。(JDK6 Update 24后)

Java虚拟机内存分配与回收策略