什么是 FullGC

一、基础概念


Full GC(全局垃圾回收) 是指 清理整个Java堆内存(包括年轻代和老年代)以及方法区(元空间) 的垃圾回收过程。它是Java虚拟机中最耗时、对应用性能影响最大的一种垃圾回收操作,通常会导致应用程序线程的暂停


二、详细解释


要深入理解 Full GC,我们需要先了解Java内存模型和垃圾回收的基本分代理论


1. Java堆内存的分代


a、年轻代 (Young Generation)


新创建的对象首先被分配在这里。年轻代又分为一个 Eden区两个 Survivor区


Eden区【伊甸园】:新创建的对象绝大部分都分配在这里,当Eden区被填满时,会触发一次 Minor GC【每呢 GC】


Survivor区【幸存者区】:是年轻代的一部分,专门用来存放在一次 Minor GC【每呢 GC】 后仍然存活的对象


b、老年代 (Old Generation)


从年轻代晋升过来的对象:Survivor区【幸存者区】经历了多次 Minor GC【每呢 GC】 后仍然存活的对象


大对象:如果对象非常大(比如很长的数组或字符串),可能会直接分配在老年代(避免在Eden和Survivor区之间进行大量复制)


c、老年代 (Old Generation)


方法区是一个线程共享的内存区域,它存储的是已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据


三、Full GC 的核心触发条件


1. 老年代空间不足(最常见)


具体场景:

  • 年轻代对象晋升:Minor GC【每呢 GC】 后,存活对象需要晋升到老年代,但老年代空间不足

  • 大对象直接分配:大对象(如大数组)直接进入老年代,但空间不足


四、命令行工具


1、实时监控 GC 情况

jstat -gcutil <pid> 1s


2、将堆内存 dump 下来

jmap -dump:format=b,file=heap.hprof <pid>


3、查看堆内存分布

jmap -heap <pid>


五、使用以下工具分析 dump 文件

  • JVisualVM

  • JConsole

  • GCViewer(分析GC日志) -


六、合理的JVM参数配置


基础堆设置

-Xms4g -Xmx4g  # 堆大小固定,避免动态调整
-Xmn2g         # 年轻代大小(一般为堆的1/2到1/3)


幸存区优化

-XX:SurvivorRatio=8     # Eden与Survivor比例
-XX:MaxTenuringThreshold=15


元空间设置

-XX:MetaspaceSize=128M
-XX:MaxMetaspaceSize=256M


GC策略选择

-XX:+UseG1GC              # G1收集器
-XX:MaxGCPauseMillis=200  # 目标暂停时间


监控和诊断

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/to/dumps
posted @ 2025-09-27 01:55  jock_javaEE  阅读(91)  评论(0)    收藏  举报