如何衡量Java中的峰值堆内存使用情况? MemoryPoolMXBean跟踪每个内存池的峰值使用情况,但不记录整个堆。峰值堆使用量不仅仅是不同堆内存池的总和。
答案 0 :(得分:4)
您是否考虑过使用totalMemory()
课程中的Runtime
功能 - docs?
还有一些免费工具,例如VisualVM或JStat,例如:
jstat -gc <pid> <time> <amount>
希望有所帮助。
答案 1 :(得分:0)
如果您需要峰值堆大小,可以合并所有类型HEAP 的内存池的峰值使用大小。
以下是一个例子:
List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
long total = 0;
for (MemoryPoolMXBean memoryPoolMXBean : pools)
{
if (memoryPoolMXBean.getType() == MemoryType.HEAP)
{
long peakUsed = memoryPoolMXBean.getPeakUsage().getUsed();
System.out.println("Peak used for: " + memoryPoolMXBean.getName() + " is: " + peakUsed);
total = total + peakUsed;
}
}
System.out.println("Total heap peak used: " + Util.format(total));
答案 2 :(得分:0)
看看这篇文章https://cruftex.net/2017/03/28/The-6-Memory-Metrics-You-Should-Track-in-Your-Java-Benchmarks.html,其中提到了GarbageCollectionNotificationInfo
并且有implementation using JMH(我还没有尝试过)