Java监视器单元测试的内存使用情况

时间:2017-09-06 07:32:41

标签: java unit-testing memory garbage-collection

我试图将每个单元测试使用的内存存储在数据库中。所以我用以下方法计算测试前后的空闲内存:

Runtime.getRuntime().freeMemory()

如果测试期间有垃圾收集,我可以通过以下方式计算:

//returns garbage collection count
private long calculateGarbageCollectionCount(){
    List<GarbageCollectorMXBean> garbageCollectorMXBean = ManagementFactory.getGarbageCollectorMXBeans();
    return garbageCollectorMXBean.get(garbageCollectorMXBean.size()-1).getCollectionCount();
}

现在我需要知道垃圾收集平均有多少内存可以自由地做这样的事情:

gcCount*memoryReleased+freeMemoryAtStart-freeMemoryAtEnd

至少有一个粗略估计垃圾收集期间释放多少内存?我尝试将MemoryPoolMXBean与getPeak方法一起使用,但我得到的值让我感到困惑。它比JVM的总内存大。

2 个答案:

答案 0 :(得分:2)

不要尝试创建自己的“性能分析应用程序”。您应该选择:

  1. 了解如何“调试”垃圾收集器 - 了解GC可以为您创建的日志。例如,请参阅here
  2. 如果“不做” - 请查看现有的工具以帮助解决这个问题。与visualvm(Oracle JDK的一部分)一样 - 甚至是your kit等商业工具。
  3. 换句话说:不要在这里发明自己的东西。依靠现有的,有效的,强大的技术。

答案 1 :(得分:1)

找到了一个有用的课程: https://github.com/Netflix/spectator/blob/master/spectator-ext-gc/src/main/java/com/netflix/spectator/gc/GcLogger.java

通过这个类,可以捕获垃圾收集事件等等,从而收集信息中发生的事情。

粗略估计单元测试使用多少内存,我会在开始之前触发垃圾收集。计算测试前后的可用内存,并总结垃圾收集期间释放的内存量。