Full GC(Full Garbage Collection)是指对整个堆内存进行垃圾回收的过程,即对新生代和老年代同时进行垃圾回收。Full GC 通常发生在以下几种情况下:
- 老年代空间不足:当老年代空间不足时,会触发 Full GC 来对整个堆内存进行垃圾回收,以尽可能地释放未使用的对象。
- 永久代空间不足(Java 7 及以下):在 Java 7 及以下版本中,永久代用于存储类的结构信息、静态变量和常量池等数据,当永久代空间不足时也会引发 Full GC。
- 显式调用 System.gc():虽然调用 System.gc() 方法并不一定会立即触发 Full GC,但在某些情况下可能会引发 Full GC 的执行。
- Concurrent Mode Failure(CMS GC):在使用 CMS(Concurrent Mark-Sweep)垃圾回收器时,如果并发标记过程中老年代空间不足,会触发 Full GC 来执行完整的垃圾回收操作。
Full GC 的发生通常会导致长时间的系统暂停,因为在 Full GC 过程中会暂停应用程序的所有线程,直到垃圾回收完成。
为了避免 Full GC 的频繁发生以及 Full GC 导致的系统暂停,可以考虑以下措施:
- 调整堆内存大小:合理地调整堆内存的大小,确保系统有足够的内存空间来避免过于频繁的 Full GC。
- 选择合适的垃圾回收器:针对具体的应用场景,选择合适的垃圾回收器,如 G1GC、ZGC 等,以提高垃圾回收的效率和减少 Full GC 的发生次数。
- 优化应用程序:通过内存分析工具识别内存泄露、不必要的对象创建等问题,并优化应用程序的内存使用方式,以减少 Full GC 的发生。
总之,Full GC 通常发生在老年代空间不足、永久代空间不足(Java 7 及以下)、显式调用 System.gc() 以及 CMS GC 的部分情况下。为了降低 Full GC 的发生频率,可以通过调整堆内存大小、选择合适的垃圾回收器和优化应用程序等手段来进行优化。