如何衡量Java中的峰值堆内存使用情况?

时间:2016-01-06 02:59:26

标签: java heap-memory

如何衡量Java中的峰值堆内存使用情况? MemoryPoolMXBean跟踪每个内存池的峰值使用情况,但不记录整个堆。峰值堆使用量不仅仅是不同堆内存池的总和。

3 个答案:

答案 0 :(得分:4)

您是否考虑过使用totalMemory()课程中的Runtime功能 - docs? 还有一些免费工具,例如VisualVMJStat,例如:

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(我还没有尝试过)