为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千万里不及你 2019-02-21 03:32:20
问题来自一个线上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对象堆积太久。 如果释放的话 那就是另一种可能 线程再线程池等待队列堆积的太多了。 还请朋友们帮忙分析!谢谢
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

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

查看完整回答
反对 回复 2019-03-01
  • 1 回答
  • 0 关注
  • 1380 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信