如何使用yourkit调查类加载器泄漏

时间:2014-04-03 08:42:12

标签: java memory-leaks garbage-collection classloader yourkit

我有一个受类加载器泄漏影响的webapp,因为PermGen在重新部署webapp后会耗尽内存。

谷歌和网络上的一些有用的人告诉我,调查此类问题的方法是在分析器中打开内存转储,找到错误的类加载器,并查看导致此问题的GC根路径装载机。 使用Yourkit这样做,我可以找到a leak due to the CompositeClassLoader of Drools,甚至设法解决它。我想。

但在应用修复程序后,我仍然看到重新部署后类加载器没有GC。当我向Yourkit询问加载器的路径时,它可以显示数百个。请不要告诉我这是我要调查的漏洞数量!

Yourkit screenshot

(前两个路径是来自Drools的路径,我在修复之前拍了快照。我还隐藏了我的公司包名,只是为了避免任何投诉。)

更令人困惑的是,如果我使用选项卡路径加载 Alt + 3 ),我的路径不会比使用命令时更多 GC根路径 Ctrl + P )打开一个新标签:

enter image description here

所以我想理解:

  • 这个加载器路径标签的确切显示了什么?引用此类加载器的类列表?但那么与班级列表标签有什么区别?什么是合并路径加载器的路径来自GC根目录的路径之间有什么区别?我无法准确理解这些标签显示的内容,而且Yourkit的文档并没有比“加载器的路径标签显示加载器的路径更多”。... ...
  • 更一般地说,我如何找到这一数据量的罪魁祸首?

我提到了Yourkit,因为这是我使用和熟悉的(至少对于其他分析任务),以防有任何特殊之处,但我认为这与其他内存转储分析器非常相似。我的Yourkit版本是8.0。

1 个答案:

答案 0 :(得分:0)

这是Yourkit建议找到类加载器泄漏的方式,它们通过它here

  • 通过一次重新部署重现问题,对于2个类加载器的场景,一个泄漏,一个当前
  • 点击类加载器标签
  • 按“没有实例的类数”
  • 对类加载器进行排序
  • 泄漏的类加载器将有很多没有实例的类,实例已被收集但不是类和类加载器本身,导致permgen泄漏
  • 识别出泄露的类加载器后,选择“路径加载器”
  • 应该显示加载器的路径,应该少于少数

这是发现泄漏的一个例子:

classloader leak

这是您正在寻找的图像,最重要的是您有泄漏的类加载器,在底部您有泄漏的原因。

通常,泄漏是由服务器类加载器上的静态变量引起的,该服务器类加载器保存对泄漏的类加载器上的对象的引用(例如WAR内部提供的JDBC驱动程序),或者由第一个类过载器启动的线程,该线程超过了deplement并且包含一个线程局部变量,该变量引用了古代类加载器的对象。