在Java虚拟机(JVM)中,垃圾收集(Garbage Collection)的过程分为两种主要类型:Minor GC和Full GC。
-
Minor GC:
- 触发时机:当新对象创建并且堆内存中的Eden区域满了时,会触发Minor GC。Minor GC主要针对年轻代(Young Generation)进行垃圾回收,包括Eden区和两个Survivor区。在Minor GC过程中,存活的对象会被移动到Survivor区,而无用的对象会被回收。
- 原因:Minor GC的目的是尽快回收那些“朝生夕灭”的对象,保持年轻代的空间能够被重复利用,减少对老年代的压力,从而延长Full GC的触发间隔。
-
Full GC:
- 触发时机:Full GC会对整个堆内存(包括年轻代和老年代)进行垃圾回收,触发的时机相对较少,通常在老年代空间不足、永久代(在Java 8之前)或元空间(在Java 8及以后)不足、内存碎片严重等情况下才会触发。Full GC的开销通常比Minor GC大,因为它需要扫描整个堆内存。
- 原因:Full GC的目的是对整个堆内存进行垃圾回收,包括老年代中存活的对象,以及清理无用的软引用、弱引用等。
触发GC的时机并不是固定的,而是由JVM根据当前堆内存的使用情况、对象的存活情况以及GC算法等因素动态决定的。通常来说,Minor GC的频率会比Full GC高,因为它只对年轻代进行回收,而Full GC则会耗费更多的时间和资源。