Java 如何分析常见泄漏嫌疑的heapdump

Java 如何分析常见泄漏嫌疑的heapdump,java,object,heap-dump,Java,Object,Heap Dump,应用程序遇到缓慢问题并生成一些heapdump文件,heapdump文件是1.2GB,我需要使用8.4GB RAM运行我的ha456.jar,才能打开heapdump 在此之前,当我分析heapdump时,我将尝试查看更大的LeakSize并检查泄漏可疑值,我可以看到我的应用程序的哪个类或哪个方法拥有大内存。然后我将尝试修复代码,使其能够以更好的性能运行 就这一次而言,我无法真正了解是哪个模块/方法导致了内存不足问题。以下是我的HeapAnalyzer的一些屏幕截图: 对我来说,它只是一个

应用程序遇到缓慢问题并生成一些
heapdump
文件,
heapdump
文件是1.2GB,我需要使用8.4GB RAM运行我的
ha456.jar
,才能打开heapdump

在此之前,当我分析
heapdump
时,我将尝试查看更大的
LeakSize
并检查泄漏可疑值,我可以看到我的应用程序的哪个类或哪个方法拥有大内存。然后我将尝试修复代码,使其能够以更好的性能运行

就这一次而言,我无法真正了解是哪个模块/方法导致了内存不足问题。以下是我的
HeapAnalyzer
的一些屏幕截图:

对我来说,它只是一个普通的类,例如java/lang/object、java/lang/Long或java/util/HashMap。我真的不知道我的应用程序的哪个方法导致内存不足


感谢您就如何分析此问题提出的建议。

这可能是由于从诸如数据库之类的地方读取了大量记录,队列类型为Long。可能有笛卡尔连接或类似的东西。有一次,我有一大堆绳子导致了oom,罪魁祸首是一个积木的伐木工人

一些想法- 当您获得oom错误时,请将其追溯到可疑方法。
获取线程转储并查看哪些线程处于活动状态以及它们正在执行什么

对于代码前面的任何人来说,查找内存泄漏总是非常困难的,更不用说目前为止了。所以我只能给你一些建议:

  • 你得到了一个堆转储,通过你自己的对象进行过滤,并分析谁创建了最多的堆
  • 运行应用程序并用VisualVM监控它,稍微使用应用程序,然后强制运行GC。。。10个对象中有9个对象的数量没有显著减少或没有完全重置,这就是内存泄漏