对象优先在Eden分配
通过分析这段代码的运行结果来得出对象优先分配在eden区
allocation123占了6MB,此时分配在Eden区,当分配allocation4的时候,allocation占4MB,eden区的空间不够了,此时进行Minor GC,survivor区放不下allocation123,所以通过分配担保机制提前转移到老年代。所以此时新生代只剩148K,老年代有6144K。
大对象直接进入老年代
分析上面这个代码,-XX:PretenureSizeThreshold参数是指定大于该值的对象直接分配到老年代,这里-XX:PretenureSizeThreshold被设置为3145728,也就是3MB,分配的allocation是4MB大于这个值,所以直接被分配到了老年代,结果可以得知新生代没怎么用,老年代用了4096K。
长期存活的对象将进入老年代
每个对象头有个对象年龄计数器,进入内存后,每经历了一次GC年龄就加1,有个函数:-XX:MaxTenuringThreshold用来设置年龄大于这个值的对象进入老年代。
以上面的测试结果为例,当这个函数设置为1时,在进行第二次Minor GC的时候,新生代里的404K被转移到老年代了;当这个函数设置为15时,第二次Minor GC的时候有404K没有被转移到老年代。
动态对象年龄判定
如果同年龄的对象,内存和大于survivor区域的一半,那么大于等于该年龄的对象都会被转移到老年代。
allocation1和2加起来等于survivor的一半,第一次GC进入survivor区,第二次GC后被送入了老年代,此时survivor区的大小是0,老年代此时有alloction3和location1、2。
空间分配担保
如果老年代剩余的连续的区域小于新生代对象的大小,或者小于每次Minor GC回收到老年代的平均值,则会进行一次Full GC。