Full GC(Full Garbage Collection)是Java虚拟机执行的一种全面的垃圾回收,会清理整个堆内存,包括新生代和老年代。Full GC 的触发通常发生在以下几种情况下:
-
老年代空间不足:
- 当老年代空间(包括PermGen或者Metaspace)不足以容纳新的对象时,会触发Full GC。老年代的空间紧张可能导致新生代的对象晋升时无法分配足够的空间,从而触发Full GC。
-
永久代空间不足(对于使用永久代的JVM版本):
- 在早期的JVM版本中,使用永久代来存储类的元数据(PermGen空间)。当加载大量类或者动态生成类时,可能导致PermGen空间不足,触发Full GC。
- 在JDK 8 及之后的版本中,永久代被移除,取而代之的是元空间(Metaspace),它的大小不再受到固定限制,而是由主机的物理内存动态分配。
-
CMS收集器的Concurrent Mode Failure:
- 在使用CMS(Concurrent Mark-Sweep)垃圾收集器时,当CMS无法为新生代提供足够的空间时,会触发Full GC。这种情况可能发生在CMS收集过程中并发清理的速度赶不上新生代对象的产生速度,从而导致空间不足。
-
System.gc() 调用:
- 调用
System.gc()
或者Runtime.getRuntime().gc()
等方式显式触发垃圾回收时,可能会触发Full GC。但这种方式不是建议的做法,因为Java虚拟机通常会尽力避免执行Full GC,以免对程序的性能产生负面影响。
- 调用
-
持久代或元空间不足:
- 在某些情况下,如果持久代(在JDK 7及之前的版本)或元空间(在JDK 8及之后的版本)不足以存储类的元数据,也可能触发Full GC。
Full GC是一种比较重量级的垃圾回收操作,因为它会停止应用程序的所有线程,对整个堆进行清理。因此,Full GC的频繁发生通常是需要关注和优化的一个方向。优化Full GC的触发机制、调整堆内存大小、使用合适的垃圾收集器等手段可以降低Full GC的频率,提高应用程序的性能。
Was this helpful?
0 / 0