跟踪 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.
所以你可以这样做:
您可以使用这些逐代统计信息。您还可以编写一些小工具,通过 JMX 计算和打印给定进程的每一代的峰值使用总和。
如果您只需要一些近似值,您可以查看 VisualVM 中的 Monitor 选项卡,Heap 图表上的紫色区域为 Used Heap,因此您也可以了解峰值使用情况。
如果您需要它来消除内存泄漏,那么您真正需要的是长期内存分配模式,同样,VisualVM 中的堆图表上提供了这种模式。 This 是一个好的开始。
【讨论】:
嗨,我检查了 java.lang.Memory.HeapMemoryUsage,它只告诉你分配的最大堆内存,而不是从开始到运行应用程序结束的内存使用峰值 哦,你是对的,对不起。检查我更新的答案,我希望这会有所帮助。【参考方案2】:您可以致电Runtime.maxMemory()
了解 VM 分配了多少内存(这通常不会缩小)。如果您在关闭挂钩中执行此操作,则该值应该非常准确。
【讨论】:
【参考方案3】:使用 jmap 或 -XX:+HeapDumpOnCtrlBreak 在任何给定时间准确测量应用程序中使用的内存。这两种机制都会在拍摄内存快照时触发 GC,因此它更准确地反映了堆的内容和大小。您可以使用jhat 打开堆转储。
【讨论】:
以上是关于跟踪 java profiler 中的最大内存使用量的主要内容,如果未能解决你的问题,请参考以下文章