1. GC处理流程图
- 整个GC流程中,最需要处理的是年轻代和老年代内存的清理操作,而元空间(永久带)都不在GC范围内。
-
当有一个新对象产生,需要分配空间;
-
首先会判断伊甸园区是否有内存空间,如果有内存空间,则直接将新对象保存在伊甸园区;
-
如果伊甸园区内存空间不足,会自动执行Minor GC操作,将伊甸园区无用的内存空间进行清理;清理之后会判断伊甸园区的内存空间是否充足?如果内存空间充足则将新的对象在伊甸园区进行分配;
-
如果执行了Minor GC操作,发现伊甸园区内存依然不足,那么会判断存活区,如果存活区有内存空间,那么会把伊甸园区的部分活跃对象保存到存活区,随后继续判断伊甸园区的空间是否充足,如果充足,则在伊甸园区进行新对象内存空间的分配;
-
如果此时存活区也已没有内存空间,那么判断老年区,如果此时老年区空间充足,则将存活区中的活跃对象保存到老年区,而后存活区就会出现空余空间,而后伊甸园区将活跃对象保存在存活区之中,而后在伊甸园区中为新对象开辟空间;
-
如果此时老年代也是满的,此时将产生Major GC(Full GC),进行老年代的内存清理;
-
如果老年代执行了Full GC之后,发现依然无法实现对象的保存,就会产生OOM异常(OutOf MemoryError)。