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(同时已修复)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)