gc日志怎么看_线上如何查看谁调用了System.gc()?

最近线上碰到了一个应用频繁full gc,但是看内存使用率却很低,感觉不是内存空间不够导致的gc,查看gc日志发现是由于显式调用了System.gc() 导致的gc,全局搜索应用却发现应用代码中并没有调用System.gc(),因此怀疑是依赖的三方包中有显式调用System.gc的行为,那么怎么查看是谁调用了呢?

代码里找不出来,便想着看线上调用的时候能不能把调用堆栈记录下来,恰好发现了Arthas,能完美解决这个问题,使用Arthas不需要重启应用。见issue:

https://github.com/alibaba/arthas/issues/20​github.com

第一步,由于java.lang.System是JDK自带的类,Arthas默认关闭了对JDK类的自带类的增强,需要通过options命令打开

第二步,使用stack命令,观察谁调用了java.lang.System#gc

本地测试代码如下:

public class PurchaseTest {
    public static void main(String[] args) throws Exception{
        System.out.println("main start");
        while(true) {
            sleep();
        }
    }
    public static void testSystemGC(){
        System.out.println("gc start");
        System.gc();
    }
    public static void sleep(){
        try {
            System.out.println("sleep start");
            TimeUnit.SECONDS.sleep(10);
        }catch (Exception e){

        }
        testSystemGC();
    }
}

监控结果如下:

9fa649180ef92f13e382659b347811b7.png

只要发生了System.gc()调用,便会被监控到,可以参考issue里把监控信息重定向到文件,这样便不用一直盯着等待System.gc被调用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值