gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:38:17 25 4
gpt4 key购买 nike

我有一个 web 应用程序存在类加载器泄漏问题,因为在多次重新部署该 web 应用程序后 PermGen 内存不足。

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

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

Yourkit screenshot

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

更令人困惑的是,如果我使用选项卡 Paths to loader (Alt+3) 与使用命令时得到的路径不同来自 GC 根的路径 (Ctrl+P) 打开一个新标签:

enter image description here

所以我想明白:

  • 这个 加载器路径 选项卡究竟显示了什么?引用此类加载器的类列表?但是类(class)列表标签有什么区别呢?什么是合并路径加载器路径GC根路径有什么区别?我无法准确理解这些选项卡显示的内容,而 Yourkit 的文档只是说“加载程序路径选项卡显示加载程序的路径。”...
  • 更一般地说,我如何找到这些数据中的罪魁祸首?

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

最佳答案

这是 Yourkit 推荐的查找类加载器泄漏的方法,他们会检查它 here :

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

这是发现泄漏的示例:

classloader leak

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

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

关于java - 如何使用 yourkit 调查类加载器泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com