比较java内存堆转储:Java桌面应用程序的内存分析

bgu*_*uiz 7 java profiling memory-management

这是一个更具体的问题,可以跟进我最近提出的另一个问题.这个问题的正确答案也将为之前的问题获得正确答案(因为那仍然处于不确定状态)!

基本上我有一个带有内存泄漏问题的Java桌面应用程序.我正在使用Netbeans IDE中的内存分析器来分析内存问题.这些是我到目前为止所采取的步骤:

  1. 将新的内存分析器附加到Netbeans项目
  2. 在几个仔细选择的代码行中定义分析点,并将它们设置为触发内存堆转储
  3. 在分析模式下运行应用程序

最终结果是我在*.hprof文件中保存了几个内存转储.Netbeans IDE允许我仔细阅读这些内存转储的内容(基本排序和搜索),甚至让我通过查看每个实例中包含的引用以及其他引用每个实例的内容来遍历堆.这一切都很好,我已经能够确定1或2个相当明显的内存泄漏,并纠正了迄今为止大约15%的问题.

但是,现在我使用的方法依赖于创建关于哪些对象在特定时间点不应该在内存中的假设,然后调查这些假设.我现在的方法是比较两个单独的堆转储:基本上我有两个堆转储应该几乎相同,因为应用程序已恢复到相同的状态.

但是,一个是在内存泄漏之前,另一个是在内存泄漏之后,所以它们显然是不同的.如果我能够使用工具比较这两个堆,而不是像我现在那样手动比较,那么我不需要依靠假设来识别泄漏发生的位置,并且可以让工具为我识别它们.
这对我来说很重要,因为这个特定应用程序所涉及的类和实例数量庞大(700多万和数百万,具有代表性)

Netbeans IDE的分析器能够做到这一点吗?
如果没有,是否有一个能够执行此任务的工具?

谢谢!

bro*_*chb 15

你可以使用jhat.具体看一下页面上的选项(-baseline baseline-dump-file)我引用它说如下:

"指定基线堆转储.具有相同对象ID的两个堆转储中的对象将被标记为不是"新".其他对象将被标记为"新".这在比较两个不同的堆转储时很有用.

这在比较两个堆转储时可能会有所帮助.


Dan*_*uth 15

此任务还有一个免费的GUI工具:VisualVM.它允许您进行多个堆转储,然后告诉它将一个堆与另一个堆进行比较,将不同的内容显示为列表,并使用每个元素的已用内存份额的图形表示.此外,交互式浏览堆转储差异比使用jhat更舒适.

  • 如果那个投了我答案的人向我解释为什么她/他这样做会很好.谢谢. (2认同)
  • 我用VisualVM进行了几次堆转储; 现在我如何比较它们? (2认同)
  • 它已移至堆转储屏幕内“类”的右上角。 (2认同)