当前,我的应用程序遭受严重的线程泄漏,但是我无法基于堆栈找到线程的来源。我该如何解决这个问题?线程堆栈是这样的:
"OkHttp ConnectionPool" #1759 daemon prio=5 os_prio=0 tid=0x00007f5fc440f000 nid=0x34ab0 in Object.wait() [0x00007f5eef0ef000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000007b233c660> (a okhttp3.ConnectionPool)
at java.lang.Object.wait(Object.java:460)
at okhttp3.ConnectionPool$1.run(ConnectionPool.java:67)
- locked <0x00000007b233c660> (a okhttp3.ConnectionPool)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
它也在本地发生吗?然后,我将在线程构造函数或setName方法上放置一个断点,然后在本地运行它。
否则,您可以使用一些内存分析器,因为它们通常使您可以找到对象的分配位置。
但是在您的情况下,我很确定可以在此线程池okhttp3.ConnectionPool
中创建线程。因此,您应该限制它的大小。如果它成功地增长了,那么找出它们为什么被阻塞这么长时间的原因-例如连接/套接字超时太长,或者只是请求太多?并确保您不会在可能在这些线程上运行的代码中发出任何长时间的处理/阻塞请求。