当前位置: 首页 > 面试题库 >

线程本地和内存泄漏

金嘉
2023-03-14
问题内容

在多个帖子中都提到了这一点:不当使用ThreadLocal会导致内存泄漏。我正在努力了解使用内存泄漏将如何发生ThreadLocal

我发现的唯一情况如下:

Web服务器维护一个线程池(例如,用于servlet)。如果ThreadLocal未删除其中的变量,则这些线程可能会导致内存泄漏,因为线程不会死亡。

这种情况下没有提到“ Perm Space”内存泄漏。那是内存泄漏的唯一(主要)用例吗?


问题答案:

PermGen的exhaustions 与组合ThreadLocal往往是由引起 的类加载器泄漏

一个示例
想象一个具有 工作线程 池的应用服务器。
它们将保持活动状态,直到应用程序服务器终止。
部署的Web应用程序在其一个类中使用一个 静态
ThreadLocal变量来存储一些线程本地数据,该数据SomeClass是Web应用程序的另一个类的实例(以下简称它)。这是在工作线程中完成的(例如,此操作源自
HTTP请求 )。


重要提示:
根据定义,对
的引用ThreadLocal __保留直到“拥有”线程死亡或ThreadLocal自身不再可访问。

如果Web应用程序 无法清除参考ThreadLocal 上关机 ,不好的事情会发生:
由于工作线程通常不会死和参考ThreadLocal是静态的,该ThreadLocal仍然引用
的情况下SomeClass,Web应用程序的类- 即使Web应用程序已停止!

因此, 无法 对Web应用程序的 类加载器进行垃圾回收 ,这意味着Web应用程序的 所有类 (和所有静态数据)都将
保持加载状态。 (这会影响PermGen内存池以及堆)。
Web应用程序的每次重新部署迭代都会增加permgen(和堆)的使用。

= >这是permgen泄漏这种泄漏的

一个流行示例是
log4j中的此bug(同时已修复)。



 类似资料:
  • 问题内容: 我对ThreadLocal的有限理解是它存在资源泄漏问题。我认为可以通过在ThreadLocal中适当地使用WeakReferences来解决此问题(尽管我可能会误解了这一点。)我只想提供一个模式或示例,以将ThreadLocal与WeakReference一起正确使用(如果存在)。例如,在此代码段中,将引入WeakReference吗? 问题答案: 在内部使用。如果未强烈引用,则即使

  • 我的WebLogic服务器配置了16GB的堆空间,但当大多数用户开始工作时,90%的堆空间在生产使用1小时内就被使用了。我观察到每当这种情况发生时,都有几条线卡住了。 我已经检查了线程转储,没有“等待锁定”对象线程,线程类似于如下所示,线程没有明显的原因被卡住。

  • 我的Optaplanner似乎出现了内存泄漏。要复制,只需下载Quarkus示例: 然后通过增加终止时间(例如,将)和取消注释表示的行来更改以启用多线程。 然后,运行手册中的请求: 内存使用量开始稳步增加,同时生成了数百万个PhreakPropagationContext对象。我认为这不是预期的行为。我应该为此制造问题还是遗漏了什么?

  • 问题内容: 我正在阅读android docs http://developer.android.com/reference/com/google/android/gms/maps/MapFragment.html ,我碰到了这句话: 从GoogleMap获得的所有对象都与该视图相关联。重要的是不要在视图的生命周期之内保留对象(例如Marker)。否则将导致内存泄漏,因为无法释放视图。 我不完全了

  • 我担心从泄漏金丝雀回来的信息。它显示了在UI上声明的所有变量,如片段中的材料按钮、材料卡片视图、文本视图、图像视图等,都导致了内存泄漏。我不知道为什么会这样。

  • 我在log4j v1中面临内存泄漏的问题。如何解决这个内存泄漏问题。此方法是定期检查log4j.properties文件在我的类中的更新。 PropertyConfigutaror.ConfigureandWatch(time_ms); 但是在关机期间,tomcat内存泄漏问题就来了。日志如下: 提前致谢