我试图用java profilers VisualVM检测我的java代码中的记忆泄漏。我想报告修复内存泄漏之前和之后的最大内存使用量。在运行VisualVM或其他java分析器时,无论如何都要找出记忆用法的高峰期?谢谢!
答案 0 :(得分:2)
您可以使用VisualVM执行此操作。首先,安装VisualVM-MBeans插件,然后重新启动VisualVM。之后在新的MBeans选项卡上选择java.lang.Memory.HeapMemoryUsage。最大值将为您提供最大分配的内存。
<强>更新强>:
我仔细检查了它,HeapMemoryUsage.max确实不是峰值堆使用率。幸运的是, java.lang.MemoryPool。&lt; Generation&gt; .PeakUsage.used 中有每代峰值使用情况统计信息。为了验证它,我编写了一个小程序来分配一些内存,而 Eden Space 和 Old Gen 以及 Survivor Space 的PeakUsage.max给出了所需的峰值堆使用情况。
所以这就是你能做的:
您可以使用这些每代统计信息。您还可以编写一些小工具,通过JMX计算并打印给定流程的每一代峰值使用总和。
如果您只需要一些近似值,可以查看VisualVM中的Monitor选项卡,Heap图表上的紫色区域是Used Heap,这样您就可以了解峰值使用情况。
如果您需要这样做以消除内存泄漏,您真正需要的是长时间内存分配模式,并且在VisualVM中的堆图表上也是如此。 This是个不错的开始。
答案 1 :(得分:0)
您可以调用Runtime.maxMemory()
以获取VM分配的内存量(这通常不会缩小)。如果你在关闭钩子中执行此操作,那么该值应该非常准确。
答案 2 :(得分:0)
使用jmap或-XX:+ HeapDumpOnCtrlBreak可以在任何给定时间准确测量应用程序中使用的内存。在获取内存快照时,这两种机制都会触发GC,因此它更准确地反映了堆的内容和大小。您可以使用jhat打开堆转储。