Java 如何使用Netbeans探查器查找内存泄漏?

Java 如何使用Netbeans探查器查找内存泄漏?,java,netbeans,profiler,Java,Netbeans,Profiler,我想在我的java应用程序中查找内存泄漏,但我不知道如何使用Netbeans profiler来做到这一点。网上有一些资源可以帮助您 简而言之,您监控“幸存的生成器”,即应用程序保存在内存中的对象 当您看到此指标失控时,可以切换到内存实时评测模式,按幸存的生成器对类进行排序,然后用鼠标右键选择“显示分配堆栈跟踪”选项NetBeans profiler的所有文档都可以在NetBeans网站上找到。他们有一个-从介绍到高级使用 设置 由于这里的一些链接有点过时,并且是针对NetBeans 6.

我想在我的java应用程序中查找内存泄漏,但我不知道如何使用Netbeans profiler来做到这一点。

网上有一些资源可以帮助您

简而言之,您监控“幸存的生成器”,即应用程序保存在内存中的对象


当您看到此指标失控时,可以切换到内存实时评测模式,按幸存的生成器对类进行排序,然后用鼠标右键选择“显示分配堆栈跟踪”选项

NetBeans profiler的所有文档都可以在NetBeans网站上找到。他们有一个-从介绍到高级使用

设置 由于这里的一些链接有点过时,并且是针对NetBeans 6.0的,因此下面是一个小的更新,用于使用来堵塞Java桌面应用程序中的内存泄漏

首先,您需要对应用程序执行广泛的搜索,以找到可能泄漏内存的一般区域/功能。因此,通过选择以下选项启动NetBeans探查器:

配置文件->配置文件项目(项目) (姓名)

然后按如下方式设置探查器:

广泛搜索 因此,当您泄漏内存时,您可以看到,为了帮助指导您的搜索,请调出遥测概述(在下图中标记为A)

在进行广泛搜索时,您希望继续运行一系列步骤,使应用程序从执行某项操作返回到原始的“干净”状态。在我的例子中,我几乎将一些数据插入到我的应用程序中(文件->打开),显示(显示),然后全部清除(文件->新建)。在我完成文件->新建后,我希望使用的堆和幸存的代数与我开始时相同。。。如果在垃圾收集器运行后它们仍然很高,则表明您泄漏了一点内存

缩小搜索范围 现在,您已经在应用程序中发现了一个泄漏内存的特性,是时候缩小搜索范围,准确地找出哪些对象仍在被引用。这是在NetBeans探查器中通过获取“堆转储”来完成的:

配置文件->获取堆转储

这将在摘要页面上打开堆,切换到“类”视图,并通过输入根包名称(即:org.yourproject)筛选项目类,按实例[%]排序,您将拥有占用最多内存的对象:

现在,运行在广泛搜索期间发现泄漏的往返步骤,并进行另一次堆转储:

配置文件->获取堆转储

通过比较这两个列表,查找第二个转储中的实例比第一个转储中的实例多的类。具有更多实例的类可能是泄漏内存的类。在第二个转储文件中,双击可能泄漏的类,以在“实例”视图中显示该类:

左边是双击的特定类的所有实例,如果选择一个实例,其字段和引用将填充在右边。因为我们怀疑这个对象可能正在泄漏,所以一定有什么东西仍然保存着对它的引用。右键单击参考列表中的“this”,然后选择“Show Nearest GC Root”。如果对话框返回时显示“找不到GC根”,这意味着Java虚拟机下次将对其进行垃圾收集,并且该对象不对内存泄漏负责。然而,如果树膨胀,那么这可能是泄漏的罪魁祸首之一

这一步的关键是从列表的顶部开始向下工作。在上图中,IntDataValue是我们认为正在泄漏的对象,树中的下一个对象是引用它的对象。字段是保存引用的变量,类型是保存引用的对象的类型。当你沿着列表往下看时,请继续浏览源代码,问问自己以下几点:

为什么这是一个参考

它应该持有推荐信吗

当我沿着树走下去,问自己这些问题时,我经常发现运行调试器和单步执行代码是找到答案的唯一方法


更新:协助缩小搜索范围 上面是我用来缩小搜索范围的原始机制,但我找到了另一种方法来帮助缩小搜索范围,方法是使用“Profile”菜单中的“Compre memory snapshot…”功能。首先拍一张快照(参见屏幕截图)

现在,运行在广泛搜索期间发现泄漏的往返步骤,并拍摄另一个快照。将它们保存到您可以使用“另存为”找到它们的地方。。。按钮

选择配置文件->比较内存快照

选择两个快照,小心地将第一个快照放在顶部插槽中,将第二个快照放在底部插槽中(否则您将得到不正确的负内存更改):

这将生成一个类似于以下内容的屏幕,其中字节数是两个快照之间分配变化的大小(即,随着分配数量的变化,大量增长可能是可疑的内存泄漏):


这难道不是公认的答案吗?其中一个图像引用已停止工作,图像丢失。。。有人能帮我把它弄回来吗D@ClintonAt在“学习”选项卡上,您将看到他们为初学者或高级用户提供了许多教程。