java静态类new的对象是否能被回收?

发布于 2022-09-06 09:22:18 字数 806 浏览 18 评论 0

问题来自一个线上GC频繁的应用,观察到老年代一直gc下不去导致应用被gc STW卡主假死,检查代码发现这样一段代码,感觉可疑

代码如下:

public class WriteEsWork {

    public static void write(List<EsIndexInfo> esList, String index, ESClusterEnum cluster, Worker worker) {
            execServer.submit(new WriteESRunnable(esList, index, cluster, worker));
        }
    private static class WriteESRunnable implements Runnable {
        private List<EsIndexInfo> esList;
                ...
    }

}

jmap查到WriteESRunnable 这个对象有不少8000多个,一个对象等于一个线程,EsIndexInfo这个对象也很多。

问题:WriteESRunnable 是一个静态内部类,这个类只会在静态方法write被调用的时候 new对象到线程池,那么当这个线程执行完成后,WriteESRunnable 对象会被释放吗?还是因为他是内部静态类会一直保留引用?
如果不释放就说明确实是因为这个问题导致WriteESRunnable 和EsIndexInfo对象堆积太久。

如果释放的话 那就是另一种可能 线程再线程池等待队列堆积的太多了。

还请朋友们帮忙分析!谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

倒数 2022-09-13 09:22:18

根据你的代码片段,只有线程池持有对[new WriteESRunnable]的引用,所以第二情况可能性比较大。
每个任务的处理太长, 任务队列没有限制导致过长,然后就发生堆积情况了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文