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

问题来自一个线上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对象堆积太久。

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

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

千万里不及你
浏览 1381回答 1
1回答

倚天杖

根据你的代码片段,只有线程池持有对[new WriteESRunnable]的引用,所以第二情况可能性比较大。 每个任务的处理太长, 任务队列没有限制导致过长,然后就发生堆积情况了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java