我有一个受类加载器泄漏影响的webapp,因为PermGen在重新部署webapp后会耗尽内存。
谷歌和网络上的一些有用的人告诉我,调查此类问题的方法是在分析器中打开内存转储,找到错误的类加载器,并查看导致此问题的GC根路径装载机。 使用Yourkit这样做,我可以找到a leak due to the CompositeClassLoader of Drools,甚至设法解决它。我想。
但在应用修复程序后,我仍然看到重新部署后类加载器没有GC。当我向Yourkit询问加载器的路径时,它可以显示数百个。请不要告诉我这是我要调查的漏洞数量!
(前两个路径是来自Drools的路径,我在修复之前拍了快照。我还隐藏了我的公司包名,只是为了避免任何投诉。)
更令人困惑的是,如果我使用选项卡路径加载( Alt + 3 ),我的路径不会比使用命令时更多 GC根路径( Ctrl + P )打开一个新标签:
所以我想理解:
我提到了Yourkit,因为这是我使用和熟悉的(至少对于其他分析任务),以防有任何特殊之处,但我认为这与其他内存转储分析器非常相似。我的Yourkit版本是8.0。
答案 0 :(得分:0)
这是Yourkit建议找到类加载器泄漏的方式,它们通过它here:
这是发现泄漏的一个例子:
这是您正在寻找的图像,最重要的是您有泄漏的类加载器,在底部您有泄漏的原因。
通常,泄漏是由服务器类加载器上的静态变量引起的,该服务器类加载器保存对泄漏的类加载器上的对象的引用(例如WAR内部提供的JDBC驱动程序),或者由第一个类过载器启动的线程,该线程超过了deplement并且包含一个线程局部变量,该变量引用了古代类加载器的对象。