full gc排查思路

遇到full gc问题 或者服务器内存飙高问题不要慌,凡事一定都有解决办法,相信自己。

1、第一步通过jdk自带的命令来了解一下大概的情况

JDK的自带工具,包括jmap、jstat等常用命令:

查看堆内存各区域的使用率以及GC情况

jstat -gcutil -h20 pid 1000

查看堆内存中的存活对象,并按空间排序

jmap -histo pid | head -n20

dump堆内存文件

jmap -dump:format=b,file=heap pid

jstat 命令看一下各个代的情况 确定的确是对象过多,那么具体如何排查是哪个对象呢

排查问题我们主要靠代码运行规律 ,工作经验 以及对Java对象的敏感度。

逐一排查,定能攻破,最重要的一点是相信自己一定能搞定

如果自己都不相信自己,怎么能让别人相信你,怎么能最终成为我们自己想成为的人呢。

好的 今天就逐步为大家展开排查思路

后续大家可以借鉴此经验来排查有关内存过大问题。

2、具体排查

第一步,先确认问题,遇到问题先想一想,不要盲目排查

先来看下第一张图片的各个参数hanyi,对我们分析gc问题帮助很大,
有的时候对一个名词理解的准确,我们做起事情来回更加得心应手。

S0 存活区 这里面的数据指的是占SO区的百分比
S1 存活区 这里面的数据是占S1区的百分比
E eden 伊甸园区 这里面的数据是占eden区的百分比
O 老年代 这里面的数据是占老年代的百分比
M 元数据区 可以理解成方法区
CCS 这个我也不知道
YGC 这个很重要 程序启动到当前 yongGC 所用的时间 单位是次数
YGCT 这个很重要 程序启动到当前 yongGC 所用的时间 单位是S
FGC 这个很重要 程序启动到当前 FUllGC 所用的时间 单位是次数
FGCT 这个很重要 程序启动到当前 FullGC 所用的时间 单位是S
GCT
这里面有一个注意的问题
我们看S0 一直是0 这个跟我们所用的垃圾回收期有关系

如果是复制算法 那么肯定是跟大家理解的一样 s1和eden复制 将存活的到s0 或者s1和eden复制 将存活的复制到s1 这样反复将存活的对象就行复制 但是G1可能不是这样的。

在这里插入图片描述

第二步 下载dump文件 根据dump文件进行分析。当然要结合代码情况,确认发生问题代码的大概问题。
用这个工具的时候注意一下,文件的格式不要选错,要不然解析不了。
在这里插入图片描述
第三步,根据代码情况确定哪些对象比较多,是不是都比较多,那可能是同一个对象引用的,导致我们看到很多对象的实例个数是一致的。这里就是看具体的对象然后进行分析了。多分析几次。
在这里插入图片描述

在这里插入图片描述
分析源头,看引用,到底是哪个类引用的,也就是找出我们的GCROOT ,一般GCROOT都是我们自己写的,可能看到我们自己的代码痕迹,找到这个那就是成功了一半。
在这里插入图片描述

最后 借用一下明朝那些事里 当前明月对王阳明的评价

学识渊博莫测,志趣高妙难知,如蛇屈伸,如龙变化,龙乘风云,可上九天。

我们不必达到此高度,但是成为一个有内涵,有学识的人总是好的。

向着这个方向努力。

时光不负有心人。

在这里插入图片描述

### 检查GC日志 首先,启用并检查垃圾收集日志是诊断频繁Full GC问题的第一步。通过分析这些日志,可以了解GC的频率、持续时间和回收效率等信息。可以通过JVM启动参数如`-Xlog:gc*:time`来开启详细的GC日志记录[^1]。 ### 使用性能分析工具 利用专业的性能分析工具,比如VisualVM、JProfiler或YourKit,可以帮助识别内存使用模式和潜在的内存泄漏点。这些工具能够提供关于堆内存分配、对象创建热点以及线程行为的深入见解。 ### 分析堆转储文件 当发现存在内存泄漏时,生成堆转储(heap dump)文件进行离线分析是非常有用的。使用Eclipse MAT (Memory Analyzer) 或者其他类似的工具,可以找出持有大量内存的对象集合及其引用链,从而定位到具体的代码位置[^1]。 ### 调整JVM参数 根据应用的实际运行情况调整JVM参数也是优化的一部分。适当增加堆大小可能有助于缓解因内存不足导致的频繁Full GC;同时,选择合适的垃圾收集器对于提高应用程序的整体性能也至关重要[^1]。 ### 优化代码逻辑 确保程序中没有不必要的对象保持存活状态,避免出现内存泄漏。例如,在使用缓存时应设置合理的过期策略;关闭不再需要的资源句柄;及时释放大对象占用的空间等。此外,对于多线程环境下共享的数据结构要特别注意同步问题,防止产生意外的长生命周期对象[^3]。 ### 示例:监控GC活动 下面是一个简单的示例,展示如何通过Java管理扩展(JMX)来获取有关垃圾收集的信息: ```java import java.lang.management.GarbageCollectorMXBean; import java.util.List; public class GCMonitor { public static void main(String[] args) throws InterruptedException { List<GarbageCollectorMXBean> gcBeans = java.lang.management.ManagementFactory.getGarbageCollectorMXBeans(); while (true) { for (GarbageCollectorMXBean bean : gcBeans) { System.out.println("Name: " + bean.getName()); System.out.println("Collection count: " + bean.getCollectionCount()); System.out.println("Collection time: " + bean.getCollectionTime() + " ms"); } Thread.sleep(5000); // 每隔5秒输出一次统计数据 } } } ``` 此程序将持续打印出各个垃圾收集器的相关统计信息,便于观察其运作状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值