[alibaba/arthas]arthas 本身内存泄漏

2025-11-10 561 views
4

场景举例(仅重现泄漏问题,不考虑代码是否实用):

java -jar ~/.arthas/lib/3.5.6/arthas/arthas-boot.jar ps aux | grep java | grep -v 'grep' | awk '{print $2}'

vmtool --action getInstances --className org.apache.shiro.cache.ehcache.EhCache --limit 2000 -x 4 --express 'instances.{? #this.size() > 0}.{{#this.keys(), #this.values()}}'

stop

循环执行以上3条命令几十、上百次后,目标进程内存占用瞬间飙升几个G,且不会释放

相似问题:#2114

回答

3
提供可重现的demo 内存泄露 heapdump之后,用工具分析找到相关对象的root是什么 执行ognl表达式可能会导致对象没有被回收: https://github.com/alibaba/arthas/issues/1794
3

测试vmtool命令:

启动 java -jar math-game.jar,启用jvisualvm来监测 attach: ./as.sh --select math-game --use-version 3.6.0 多次执行 vmtool --action getInstances --className java.lang.String --limit 2000

结果:

执行普通程序无法重现。

6

测试程序代码: `import java.util.ArrayList; import java.util.List;

public class Demo {

private List<Object> objectList;

public static void main(String[] args) throws Exception{
    // 实例容器
    List<Demo> demoList = new ArrayList<>();
    // 创建100个Demo实例
    for(int j = 0; j < 100; j ++) {
        List<Object> objectList = new ArrayList<>();
        // 每个Demo实例存放10个对象
        for(int i = 0; i < 10; i ++) {
            objectList.add(new Object());
        }
        demoList.add(new Demo().setObjectList(objectList));
    }
    System.out.println(demoList.size());

    // 维持住进程,方便注入重现
    Thread.sleep(86400 * 1000);
}

public List<Object> getObjectList() {
    return objectList;
}

public Demo setObjectList(List<Object> objectList) {
    this.objectList = objectList;
    return this;
}

} `

循环执行 以下3条 命令20次:

java -jar ~/.arthas/lib/3.6.0/arthas/arthas-boot.jar ps aux | grep java | grep -v 'grep' | awk '{print $2}' vmtool --action getInstances --className Demo --limit 2000 -x 4 --express 'instances.{? #this.getObjectList().size() > 0}.{{#this.getObjectList()}}' stop

结果:

测试代码对象比较简单,只为证明存在泄漏情况,手动执行GC未能释放(约泄漏了170M内存)

7

这个的确是ognl表达式引起的,如果执行 vmtool 命令不带 --express,则arthas可以干净close掉。heapdump 之后可以发现没有arthas相关的对象。

ognl怎么干净close,这个还要研究下。

https://github.com/alibaba/arthas/issues/1794