这是一个更具体的问题,要跟进[我最近问过的另一个问题]1。此问题的正确答案也将为上一个问题赢得正确答案(因为该问题仍处于不确定状态)!
基本上我有一个存在内存泄漏问题的 Java 桌面应用程序。我正在使用 NetBeans IDE 中的内存分析器来分析内存问题。这些是我到目前为止已采取的步骤:
最终结果是我有几个内存转储保存到磁盘上的
*.hprof
文件中。 NetBeans IDE 让我可以仔细研究这些内存转储的内容(基本排序和搜索),甚至可以让我通过查看每个实例中包含的引用以及引用每个实例的其他对象来“遍历堆”。这一切都很好,到目前为止我已经能够识别 1 或 2 个相当明显的内存泄漏并纠正了大约 15% 的问题。
但是,现在我使用的方法依赖于创建关于在特定时间点哪些对象不应该存在于内存中的假设,然后进行调查。我现在追求的是一种比较两个单独的堆转储的方法:基本上我有两个堆转储应该几乎相同,因为应用程序已恢复到相同的状态。 但是,一个是内存泄漏之前,一个是内存泄漏之后,显然是不同的。如果我能够使用 of 工具比较这两个堆,而不是像我现在那样手动比较,那么我就不需要依赖假设来识别泄漏发生的位置,而只需让该工具为我识别它们.
这对我来说很重要,因为这个特定应用程序涉及的类和实例数量巨大(分别为 700 多个和数百万)NetBeans IDE 的分析器能够执行此操作吗?
如果没有,是否有工具可以执行此任务?
还有一个用于此任务的
免费 GUI
工具:jhat。具体查看我引用的页面上的选项(-baseline benchmark-dump-file),它的内容如下: “指定基线堆转储。两个堆转储中具有相同对象 ID 的对象将被标记为不是“新”。其他对象将被标记为“新”。这在比较两个不同的堆转储时很有用。”