跟踪 java profiler 中的最大内存使用量

Posted

技术标签:

【中文标题】跟踪 java profiler 中的最大内存使用量【英文标题】:Keep track of the maximum memory use in java profiler 【发布时间】:2009-11-19 15:38:26 【问题描述】:

我正在尝试使用 java profilers VisualVM 检测我的 java 代码中的内存泄漏。我想在修复内存泄漏之前和之后报告最大内存使用量。在运行 VisualVM 或其他 java 分析器时,是否有办法找出内存使用的峰值?谢谢!

【问题讨论】:

你打算什么时候踏上这个足迹? 我需要找出应用程序从开始到结束的内存使用峰值。 【参考方案1】:

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

更新

我仔细检查过,HeapMemoryUsage.max 确实不是堆使用的峰值。幸运的是,java.lang.MemoryPool..PeakUsage.used 中有每一代的峰值使用统计信息。为了验证它,我编写了一个分配一些内存的小程序,PeakUsage.max for Eden Space plus Old Gen plus Survivor Space 给出了期望的峰值堆使用量。

所以你可以这样做:

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

如果您只需要一些近似值,您可以查看 VisualVM 中的 Monitor 选项卡,Heap 图表上的紫色区域为 Used Heap,因此您也可以了解峰值使用情况。

如果您需要它来消除内存泄漏,那么您真正需要的是长期内存分配模式,同样,VisualVM 中的堆图表上提供了这种模式。 This 是一个好的开始。

【讨论】:

嗨,我检查了 java.lang.Memory.HeapMemoryUsage,它只告诉你分配的最大堆内存,而不是从开始到运行应用程序结束的内存使用峰值 哦,你是对的,对不起。检查我更新的答案,我希望这会有所帮助。【参考方案2】:

您可以致电Runtime.maxMemory() 了解 VM 分配了多少内存(这通常不会缩小)。如果您在关闭挂钩中执行此操作,则该值应该非常准确。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于跟踪 java profiler 中的最大内存使用量的主要内容,如果未能解决你的问题,请参考以下文章

visualvm-profile

Memory Profile 的使用

Uber开源JVM Profiler,用以跟踪分布式Java虚拟机

Linuxasync-profiler

Linuxasync-profiler

Linuxasync-profiler