这是一个更具体的问题,是对我最近提出的另一个问题的跟进。对于这个问题的正确答案也将为之前的问题赢得一个正确答案(因为那个问题仍然悬而未决)!
基本上,我有一个存在内存泄漏问题的Java桌面应用程序。我正在使用NetBeans IDE中的内存分析器来分析内存问题。到目前为止,我已经采取了以下步骤:
1. 将一个新的内存分析器附加到NetBeans项目上 2. 在几个精心选择的代码行上定义分析点,并设置它们以触发内存堆转储 3. 以分析模式运行应用程序
这样做的最终结果是,我在磁盘上保存了几个内存转储文件(*.hprof)。NetBeans IDE允许我浏览这些内存转储文件的内容(基本排序和搜索),甚至让我“遍历堆”,通过查看每个实例内包含的引用以及其他对象对每个实例的引用来了解情况。这一切都很好,到目前为止,我已经能够识别出1或2个相当明显的内存泄漏问题,并解决了大约15%的问题。
然而,目前我使用的方法依赖于在特定时间点创建关于哪些对象不应该在内存中的假设,然后进行调查。我现在想要的是一种比较两个独立堆转储的方法:基本上,我有两个堆转储,它们应该几乎相同,因为应用程序已经恢复到相同的状态。
然而,一个是在内存泄漏之前,另一个是在内存泄漏之后,所以它们显然是不同的。如果我能够使用工具来比较这两个堆转储,而不是像现在这样手动比较,那么我就不需要依赖假设来确定泄漏发生的位置,而可以让工具为我识别它们。
对于我来说,这很重要,因为这个特定应用程序涉及的类和实例数量非常庞大(分别为700+和数百万)。
NetBeans IDE的分析器能够做到这一点吗?
如果不能,是否有其他工具能够执行这个任务?
基本上,我有一个存在内存泄漏问题的Java桌面应用程序。我正在使用NetBeans IDE中的内存分析器来分析内存问题。到目前为止,我已经采取了以下步骤:
1. 将一个新的内存分析器附加到NetBeans项目上 2. 在几个精心选择的代码行上定义分析点,并设置它们以触发内存堆转储 3. 以分析模式运行应用程序
这样做的最终结果是,我在磁盘上保存了几个内存转储文件(*.hprof)。NetBeans IDE允许我浏览这些内存转储文件的内容(基本排序和搜索),甚至让我“遍历堆”,通过查看每个实例内包含的引用以及其他对象对每个实例的引用来了解情况。这一切都很好,到目前为止,我已经能够识别出1或2个相当明显的内存泄漏问题,并解决了大约15%的问题。
然而,目前我使用的方法依赖于在特定时间点创建关于哪些对象不应该在内存中的假设,然后进行调查。我现在想要的是一种比较两个独立堆转储的方法:基本上,我有两个堆转储,它们应该几乎相同,因为应用程序已经恢复到相同的状态。
然而,一个是在内存泄漏之前,另一个是在内存泄漏之后,所以它们显然是不同的。如果我能够使用工具来比较这两个堆转储,而不是像现在这样手动比较,那么我就不需要依赖假设来确定泄漏发生的位置,而可以让工具为我识别它们。
对于我来说,这很重要,因为这个特定应用程序涉及的类和实例数量非常庞大(分别为700+和数百万)。
NetBeans IDE的分析器能够做到这一点吗?
如果不能,是否有其他工具能够执行这个任务?