【发布时间】:2009-11-19 15:38:26
【问题描述】:
我正在尝试使用 java profilers VisualVM 检测我的 java 代码中的内存泄漏。我想在修复内存泄漏之前和之后报告最大内存使用量。在运行 VisualVM 或其他 java 分析器时,是否有办法找出内存使用的峰值?谢谢!
【问题讨论】:
-
你打算什么时候踏上这个足迹?
-
我需要找出应用程序从开始到结束的内存使用峰值。
我正在尝试使用 java profilers VisualVM 检测我的 java 代码中的内存泄漏。我想在修复内存泄漏之前和之后报告最大内存使用量。在运行 VisualVM 或其他 java 分析器时,是否有办法找出内存使用的峰值?谢谢!
【问题讨论】:
你可以用 VisualVM 做到这一点。首先,安装 VisualVM-MBeans 插件,然后重启 VisualVM。之后在新的 MBeans 选项卡上选择 java.lang.Memory.HeapMemoryUsage。最大值将为您提供最大分配的内存。
更新:
我仔细检查过,HeapMemoryUsage.max 确实不是堆使用的峰值。幸运的是,java.lang.MemoryPool.
所以你可以这样做:
您可以使用这些逐代统计信息。您还可以编写一些小工具,通过 JMX 计算和打印给定进程的每一代的峰值使用总和。
如果您只需要一些近似值,您可以查看 VisualVM 中的 Monitor 选项卡,Heap 图表上的紫色区域为 Used Heap,因此您也可以了解峰值使用情况。
如果您需要它来消除内存泄漏,那么您真正需要的是长期内存分配模式,同样,VisualVM 中的堆图表上提供了这种模式。 This 是一个好的开始。
【讨论】:
您可以致电Runtime.maxMemory() 了解 VM 分配了多少内存(这通常不会缩小)。如果您在关闭挂钩中执行此操作,则该值应该非常准确。
【讨论】:
使用 jmap 或 -XX:+HeapDumpOnCtrlBreak 在任何给定时间准确测量应用程序中使用的内存。这两种机制都会在拍摄内存快照时触发 GC,因此它更准确地反映了堆的内容和大小。您可以使用jhat 打开堆转储。
【讨论】: