JVM--内存分配

对象首先分配在Eden区

对象在新生代Eden区中分配,当Eden区中没有足够的进行分配时,虚拟机将发生一次Minor GC(新生代垃圾收集动作)

大对象直接进入Survivor区

大对象直接回被分配到Survivor区,大对象主要是指需要大量内存空间的Java对象,可以使用-XX:PretenureSizeThreshold设置对象分配在Survivor区中的,如果一个对象需要的内存大小超过了这个设定的值,那么此对象就会被分配到Survivor区。此参数只对Serial和ParNew参数有效。

长期存活的对象

我们知道在一个分配在堆中对象的对象头主要包括两部分,第一部分是Mark Word,第二部分是指向类元数据的指针。Mark Word就记录了对象的GC次数。我们可以设置-XX:MaxTuenuringThreshold来设置一个对象经过多次Minor GC以后会进入老年代。

如果判断一个对象的年龄

如果Survivor中的对象中相同年龄的对象超过了ToSurvivor区间的一半,那么此时大于和等于这个年龄的对象都会放到To Survivor区。

空间分配担保

在发生MinorGC之前需要判断Survivor的区间是否大于新生代所有对象的总空间。那么MinorGC可以确保是安全的。如果这个条件成立,那么就直接进行MinorGC。否则查看历代老年最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试进行一次MinorGC,否则进行一次FullGC。

你可能感兴趣的:(java)