对象的内存分配,大概就是往堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按照线程优先在TLAB上分配,少数情况下会直接分配在老年代中,分配规则不是固定的,这取决于使用了哪种垃圾收集器还有虚拟机中与内存相关的参数的设置。
对象优先在Eden分配
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次MinorGC。
大对象直接进入老年代
虚拟机提供了可修改的参数,另大于这个参数设定大小的对象,直接进入老年代,这样做的目的是避免对象在eden空间和Survivor空中发生大量的内存复制。
长期存活的对象将进入老年代
虚拟机给那个对象定义了一个对象年龄计数器,如果对象在Eden出生并经过第一次MinorGC后仍然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,并且对象年龄设为1。对象在Survivor区中每“熬过”一次MinorGC,年龄就增加1岁,当年龄增加到一定程度(默认15),就将会被晋升到老年代中,
动态对象年龄判定
如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,那么这些大于或等于该年龄的对象可以直接进入老年代。
空间分配担保
在MinorGC之前,虚拟机检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果大于的话就正常GC,不大于可能会触发FullGC。