【问题标题】:ThreadLocal leak in webservice clientWeb服务客户端中的ThreadLocal泄漏
【发布时间】:2014-12-18 06:28:48
【问题描述】:

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

有没有清除那些线程本地人?由于 webservice 调用实际上是从第三方库调用的,我无法直接清除线程本地。

【问题讨论】:

    标签: java multithreading web-services memory-leaks thread-local


    【解决方案1】:

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

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

    更多信息请阅读post

    【讨论】:

    • 感谢 Shazin 的回答。再问一个问题,我没有收到预期的 PermGen 错误,而是收到了与堆相关的错误。
    • 是的,当堆足够满时,您最终会得到 PermGen Memory Error。
    • 堆填满如何导致 PermGen 错误? PermGen 不是堆的一部分
    • 那是因为如果一个对象应该存在于进程之上,那么对象就会被移动到 PermGen。如本例所示,ThreadLocal 变量获取的堆空间在其进程中长期存在。
    • 抱歉,但这种情况适用于容器,其中每个上下文/部署的应用程序使用不同的类加载器。但这是一个独立的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2014-09-04
    • 2019-05-15
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多