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对象堆积太久。
如果释放的话 那就是另一种可能 线程再线程池等待队列堆积的太多了。
还请朋友们帮忙分析!谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据你的代码片段,只有线程池持有对[new WriteESRunnable]的引用,所以第二情况可能性比较大。
每个任务的处理太长, 任务队列没有限制导致过长,然后就发生堆积情况了。