1.判断对象进入年轻代还是老年代
GC一般发生在对象创建时分配空间的过程中,当对象创建时会根据对象的大小决定对象是进入年轻代还是老年代。当对象大小超过一定的阈值就会被认为大对象,大对象会直接进入老年代,否则会进入年轻代。
2.在年轻代创建对象
年轻代创建对象一般会在Eden区,但是当Eden区空间不够时会触发一次Young GC 。YongGC过程中会将Eden区和From Survivor区存活的对象复制到To Survivor区,然后将Eden区和From Survivor区的对象清理掉。
但是如果To Survivor区的空间存不下这些对象,那就需要进行空间分配担保,如果担保成功就正常进行Young GC,如果担保失败则说明老年代空间也不够了,这时候会触发一次Full GC。
在年轻代中长期存活的对象,当GC次数达到一定的阈值后还没有被回收,它也会被放到老年代中。
3.老年代中创建对象
当我们老年代中的空间不够了,或者前面提到的空间担保失败了就会触发Full GC。如果Full GC之后空间还是不够,这时候JVM会抛出内存不足的异常即OOM。