Java监控单元测试的内存使用

Java监控单元测试的内存使用,java,unit-testing,memory,garbage-collection,Java,Unit Testing,Memory,Garbage Collection,我试图将每个单元测试使用的内存存储到数据库中。因此,我使用以下公式计算测试前后的可用内存: Runtime.getRuntime().freeMemory() 如果在测试期间存在垃圾收集,我会通过以下方式进行计数: //returns garbage collection count private long calculateGarbageCollectionCount(){ List<GarbageCollectorMXBean> garbageCollectorMXB

我试图将每个单元测试使用的内存存储到数据库中。因此,我使用以下公式计算测试前后的可用内存:

Runtime.getRuntime().freeMemory()
如果在测试期间存在垃圾收集,我会通过以下方式进行计数:

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

是否至少粗略估计了在垃圾收集过程中释放了多少内存?我尝试将MemoryPoolMXBean与getPeak方法一起使用,但得到的值让我感到困惑。它比JVM拥有的总内存还大。

不要尝试创建自己的“评测应用程序”。你应该在以下两者之间做出选择:

  • 学习如何“调试”垃圾收集器-通过了解GC可以为您创建的日志。例如,见
  • 如果这“不起作用”-请查看现有的工具以帮助解决这一问题。比如(OracleJDK的一部分)——甚至是商业工具,比如

  • 换句话说:不要在这里发明你自己的东西。依赖现有的、有效的、健壮的技术。

    不要试图创建自己的“评测应用程序”。你应该在以下两者之间做出选择:

  • 学习如何“调试”垃圾收集器-通过了解GC可以为您创建的日志。例如,见
  • 如果这“不起作用”-请查看现有的工具以帮助解决这一问题。比如(OracleJDK的一部分)——甚至是商业工具,比如

  • 换句话说:不要在这里发明你自己的东西。改用现有的、有效的、健壮的技术。

    发现了一个有用的类,它有助于:

    有了这个类,就可以捕获垃圾收集事件,并收集其中发生的信息


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

    找到了一个有用的类,它有助于:

    有了这个类,就可以捕获垃圾收集事件,并收集其中发生的信息


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

    “在单元测试中垃圾回收器出现错误时遇到了一些问题”-是否愿意分享哪种错误?有一些工具可用于此,例如探查器。不要试图发明自产的解决方案。@alfa在这两个问题中:“java.lang.OutOfMemoryError:超出GC开销限制”和“java.lang.OutOfMemoryError:java堆空间”我不得不编辑我的问题,它太宽泛了。也许您可以再看一次。
    freemory()
    报告直接可用(已分配)内存,或者换句话说,
    totalMemory()
    的空闲部分,但是
    totalMemory()
    不是一个常数。因此
    freemory()
    可能会报告更多内存,因为GC分配的内存比释放的内存多。甚至可能是另一种情况,
    freemory()
    报告的内存更少,因为GC释放了太多的内存,JVM给了操作系统一些内存。因此,它不是适合这项工作的工具。“在单元测试中遇到了一些垃圾收集器错误问题”-是否愿意分享哪种错误?有一些工具可用于此,例如探查器。不要试图发明自产的解决方案。@alfa在这两个问题中:“java.lang.OutOfMemoryError:超出GC开销限制”和“java.lang.OutOfMemoryError:java堆空间”我不得不编辑我的问题,它太宽泛了。也许您可以再看一次。
    freemory()
    报告直接可用(已分配)内存,或者换句话说,
    totalMemory()
    的空闲部分,但是
    totalMemory()
    不是一个常数。因此
    freemory()
    可能会报告更多内存,因为GC分配的内存比释放的内存多。甚至可能是另一种情况,
    freemory()
    报告的内存更少,因为GC释放了太多的内存,JVM给了操作系统一些内存。所以这不是适合这份工作的工具。自我回答是个好的开始。虽然你总是想把一些真实内容的链接,你给-链接可以打破。欢迎来到“向上投票”级别;-)自我回答的良好开端。虽然你总是想把一些真实内容的链接,你给-链接可以打破。欢迎来到“向上投票”级别;-)
    gcCount*memoryReleased+freeMemoryAtStart-freeMemoryAtEnd