我正在尝试使用OOME的堆转储来分析问题,为此我使用了MAT。 我读到了如何使用MAT here。
它是一个部署在tomcat服务器上并使用spring和hibernate的Web应用程序。当我看到转储的支配树时,我只能看到hibernate对象,这是否意味着内存泄漏是由于我的hibernate将对象保存在内存中,或者我在这里遗漏了什么?
答案 0 :(得分:2)
从您上传的图片中我们无法得出内存泄漏的结论,并且显示的对象是内存泄漏的原因。
如果JVM未被任何其他对象引用,则基本上该对象会被JVM收集。内存泄漏是一种情况,其中一个对象在逻辑上不再有用,但由于内存中另一个对象的不必要引用而停留在内存中。
如果您尝试在应用程序中测试内存泄漏,您所要做的就是确定每次访问应用程序时堆积在堆中的对象。要有效地识别对象首先采取和初始堆。然后在您的应用程序中执行一些操作然后离开应用程序以便GC发生,然后进行堆转储。该工具提供了一个选项来比较堆转储,这将标识从基本堆转储中急剧增加的对象。然后,您可以钻取对象以识别谁持有此对象的引用。
答案 1 :(得分:0)
尝试使用jvisualvm探查器,启用"记录分配堆栈跟踪"找到这些对象的创建位置的选项,然后您可以分析存储它的位置......