java system.gc不会立即执行_Java问题案例分析---谁调用了system.gc()

线上系统每小时出现一次full GC,通过设置JVM参数和分析heap dump未找到原因。观察GC日志发现full GC由system.gc()触发,但代码中未直接调用。使用BTrace工具定位到问题是由导出Excel工具间接触发。另一个解决方案是利用Arthas工具监控并避免system.gc()导致的full GC。可以设置JVM参数-XX:-+DisableExplicitGC或调整项目组件来防止这种情况。
摘要由CSDN通过智能技术生成

在运维线上系统的时候,发现一个比较奇怪的现象,每隔一个小时出现一次full gc的情况,而且full gc偶尔也会出现,问题十分奇怪,jvm 堆内存虽然说是比较小,但是实际的交易量很小,也会出现这种情况。

处理方法:

1.在应用的启动参数中,增加-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC

-XX:HeapDumpPath=/tmp/,对发生full gc之前和之后,对jvm内存进行一次dump,jvm会将文件生成到/tmp/ 这个目录, 之后分析,没有发现什么大的对象。

2.观察gc的日志信息发现,full gc是由system.gc()触发的

9413e4d67e56521128b3b0dba89e5686.png

那么问题来了,谁调用了这个system.gc(),在代码中找寻了半天都没有

这里介绍两种方式解决,第一种btrace工具,通过编写btrace代码,对system.gc 方法进行监控,获取执行的堆栈信息.

f3edc0e5ed1e07347f2b1ad63de38b6e.png

在应用程序上执行,btrace javaPid javaFile.java (需要提前下载btrace工具),javaPid就是对应的java进程号,javaFile.java就是编写的java脚本。执行之后,我们发现:

ea848622d38cac4f9a5fdb80c16636d2.png

是由于一个导出的excel工具触发的system.gc(),也就是每次导出excel就会有触发full gc这种情况.

第二个方法,就是使用阿尔萨斯这个工具进行排查,这个工具更加快捷

快速入门 - Arthas 3.1.0 文档 有兴趣可以看看这个工具,

执行执行wget https://alibaba.github.io/arthas/arthas-boot.jar

java -jar arthas-boot.jar

之后选定需要监控的java 进程id,之后执行options unsafe true,这就可以监控系统类,然后执行stack java.lang.System gc,就是监控gc这个方法,执行,就会打印方法上下文的堆栈

4ff3f25bb858626dda4c4a7c5f8af692.png

大家可以根据,自己的情况,选择合适的工具,排查问题.解决由system.gc()引发的full gc可以在jvm参数中添加,-XX:-+DisableExplicitGC,或者实际项目情况中使用的组件设置,避免system gc触发full gc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值