Java webservice客户端中的ThreadLocal泄漏

Java webservice客户端中的ThreadLocal泄漏,java,multithreading,web-services,memory-leaks,thread-local,Java,Multithreading,Web Services,Memory Leaks,Thread Local,我有一个独立的应用程序,它使用VMware的Java Webservice API,这是一个围绕Webservice客户端的包装器。我使用大小为5的固定线程池来调用库中的API。运行一段时间(一两天)后,内存使用率逐渐上升,堆转储显示池线程的线程局部已积累了大量内存 是否有任何方法可以清除这些线程局部变量?由于webservice调用实际上是从第三方库调用的,因此我无法直接清除线程局部变量。这是一个与ThreadLocal相关的经典问题。线程局部变量是全局线程局部变量(受限且属于线程),它们不能

我有一个独立的应用程序,它使用VMware的Java Webservice API,这是一个围绕Webservice客户端的包装器。我使用大小为5的固定线程池来调用库中的API。运行一段时间(一两天)后,内存使用率逐渐上升,堆转储显示池线程的线程局部已积累了大量内存


是否有任何方法可以清除这些线程局部变量?由于webservice调用实际上是从第三方库调用的,因此我无法直接清除线程局部变量。

这是一个与
ThreadLocal
相关的经典问题。线程局部变量是全局线程局部变量(受限且属于线程),它们不能与线程池一起使用,线程池即使在任务结束后仍保留线程。这最终将导致PermGen内存问题

由于您无法更改第三方库中的
ThreadLocal
s,因此可以避免使用线程池,并为每个任务随意创建/启动/销毁线程。这样可以避免线程在任务完成后处于活动状态,并避免使用
ThreadLocal
变量意外占用内存


要了解更多信息,请阅读此

感谢Shazin的回答。还有一个问题,我没有得到预期的PermGen错误,而是得到了与堆相关的错误。是的,当堆足够满时,最终会得到PermGen内存错误。堆被填满如何会导致PermGen错误?PermGen不是Heap的一部分,这是因为若一个对象应该在进程存在时生存,那个么该对象将被移动到PermGen。在本例中,ThreadLocal变量获取的堆空间在其进程中是长期存在的。很抱歉,这种情况适用于容器,其中每个上下文/部署的应用程序使用不同的类装入器。但这是一个独立的应用程序。