2009-11-19 48 views
3

我想用Java Profiler VisualVM检测我的java代码中的memeory泄漏。我想在修复内存泄漏之前和之后报告最大内存使用情况。在运行VisualVM或其他Java分析器时,是否有无法找到Memeory使用的高峰?谢谢!跟踪java profiler中的最大内存使用情况

+0

什么时候你要采取足迹? – 2009-11-19 15:48:04

+0

我需要从应用程序的开始到结束找出内存使用的高峰。 – flyingfromchina 2009-11-19 16:47:53

回答

2

你可以用VisualVM来做到这一点。首先,安装VisualVM-MBeans插件,然后重新启动VisualVM。之后,在新的MBeans选项卡上选择java.lang.Memory.HeapMemoryUsage。最大值将为您提供最大的分配内存。

更新

我双重检查它,HeapMemoryUsage.max是不是峰值堆的使用情况确实如此。幸运的是,在java.lang.MemoryPool中有每代高峰使用统计信息。 <代号> .PeakUsage.used。为了验证它,我写了一个小程序,分配一些内存,PeakUsage.max用于Eden SpaceOld Gen幸存者空间给出了所需的峰值堆用量。

因此,这里是你可以做什么:

  • 您可以使用这些每代的统计数据。您还可以编写一些小工具,通过JMX计算并打印给定进程的每个代的峰值使用总和。

  • 如果您只需要一些近似值,您可以检查VisualVM中的Monitor选项卡,Heap图表上的紫色区域是使用Heap的,因此您可以对高峰使用情况有所了解。

  • 如果您需要这样做来消除内存泄漏,您真正需要的是长时间内存分配模式,并且可以在VisualVM的堆图上找到它。 This是一个好的开始。

+0

嗨,我检查了java.lang.Memory.HeapMemoryUsage,它只告诉你分配的最大堆内存,而不是从开始到结束运行你的应用程序的内存使用高峰。 – flyingfromchina 2009-11-20 14:47:42

+0

哦,你是对的,对不起。检查我更新的答案,我希望这可以帮助。 – candiru 2009-11-21 09:58:12

0

您可以调用Runtime.maxMemory()了解VM分配了多少内存(通常不会缩小)。如果你在关机钩子中这样做,那么该值应该非常准确。

0

使用jmap或-XX:+ HeapDumpOnCtrlBreak在任何给定时间准确测量应用程序中使用的内存。这两种机制都会在获取内存快照时触发GC,因此它更准确地反映了堆的内容和大小。您可以使用jhat来打开堆转储。