我有一个独立的应用程序,该应用程序使用VMware的Java Webservice API,这是Webservice客户端的包装。我正在使用大小为5的固定线程池来调用库中的API。在运行一段时间(一两天)后,内存使用率逐渐上升,堆转储显示池化线程的线程本地线程已累积了大量内存。
无论如何有清除这些线程本地人?由于实际上是从第三方库调用webservice调用,因此我无法直接清除线程本地。
最佳答案
这是与ThreadLocal
有关的经典问题。线程局部变量是全局线程局部变量(受限制并属于该线程),即使在任务结束后也不得与保留线程的线程池一起使用。最终将导致PermGen内存问题。
由于您无法更改第三方库中的ThreadLocal
,因此可以避免使用线程池,并随意为每个任务创建/启动/销毁线程。这样,您可以避免线程在任务完成后仍处于活动状态,并避免使用ThreadLocal
变量保留意外的内存。
有关更多信息,请阅读此post
关于java - Web服务客户端中的ThreadLocal泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27540443/