对象优先在Eden区分配
大多数情况下,对象在Eden区进行分配。
当Eden区没有足够的空间来进行分配时,就会触发Young GC(Minor GC)。
当触发Young GC时,如果Survivor区不够放存活的对象,那么就会触发分配担保机制提前转移到老年代。
大对象直接进入老年代
大对象的问题:
1、容易导致内存明明还有不少空间时就提前触发垃圾收集。
2、复制大对象时需要高额的内存复制开销。
HotSpot提供了-XX:PretenureSizeThreshold ,指定了大于该设置值的对象直接在老年代分配,目的是为了避免大对象在Eden及两个Surivor区之间的来回复制。
长期存活的对象将进入老年代
虚拟机给每个对象定义了一个对象年龄的计数器,存储在对象头中。
每次经历Young GC且仍存活的对象,都会加一岁。当到达指定的年龄(默认15岁)就会进入到老年代。
动态对象的年龄判断
HotSpot虚拟机并不是一定要求对象达到指定年龄才能进入老年代。
当某一个年龄(x)的所有对象的大小占survivor区大于一半时,那么年龄≥x的对象都会晋升到老年代。
GC的触发条件
Young GC
当年轻代空间不足时,就会触发Young GC。
Old GC
当老年代内存不足时,会触发Old GC。
Full GC
触发条件:
1、老年代或者元空间内存不足
2、System.gc()方法调用
3、堆内存分配担保失败(大对象)