当前位置: 首页 > 知识库问答 >
问题:

报告JMH基准测试的最大堆大小

孔城
2023-03-14

我正在使用Java测量线束(JMH)对一些例程进行基准测试。我对获取每次运行的最大堆大小感兴趣。JMH的GC Profiler为我提供了诸如分配率和流失率之类的信息,但我正在寻找在测试运行期间堆获得的最大值。这能做到吗?

共有1个答案

於和志
2023-03-14

您可以实现自己的Profiler:

public class MaxMemoryProfiler implements InternalProfiler {

    @Override
    public String getDescription() {
        return "Max memory heap profiler";
    }

    @Override
    public void beforeIteration(BenchmarkParams benchmarkParams, IterationParams iterationParams) {

    }

    @Override
    public Collection<? extends Result> afterIteration(BenchmarkParams benchmarkParams, IterationParams iterationParams,
        IterationResult result) {

        long totalHeap = Runtime.getRuntime().totalMemory(); // Here the value
                                                         // you want to
                                                         // collect

        Collection<ScalarResult> results = new ArrayList<>();
        results.add(new ScalarResult("Max memory heap", totalHeap, "bytes", AggregationPolicy.MAX));

        return results;
    }
}

并将其添加到您的OptionsBuilder:

    OptionsBuilder()
         /* options ... */               
        .addProfiler(MaxMemoryProfiler.class);

将“聚合策略.MAX添加到标量结果”选项后,输出将是执行的每个基准测试的最大结果。

顺便说一下,如果你想对内存进行度量,你可以阅读https://cruft ex . net/2017/03/28/The-6-Memory-Metrics-You-Should-Track-in-Your-Java-benchmarks . html

 类似资料:
  • 我想写一个基准来跟踪执行一些Java代码所需的最大、最小和平均时间。 我读了关于JMH(JavaMicro基准线束),它似乎符合我的需求,但我不太确定我应该使用哪种模式: > 通过在有时限的迭代中连续调用基准方法并计算我们执行该方法的次数来测量原始吞吐量。 这似乎不是我想要的。 测量执行基准测试方法所需的平均时间。 这应该是我需求的三分之一。 衡量单个基准方法执行运行所需的时间。 这似乎不是我想要

  • 我使用JMH对DOM解析器进行基准测试。我得到了非常奇怪的结果,因为第一次迭代实际上比后面的迭代运行得更快 有人能解释为什么会这样吗?此外,百分位数和所有数字意味着什么?为什么在第三次迭代后它开始变得稳定?一次迭代是否意味着整个基准测试方法的一次迭代?下面是我正在运行的方法

  • 受另一个关于堆栈溢出的问题的启发,我编写了一个微型基准来检查,什么更有效: 有条件地检查零除数或 捕获和处理 下面是我的代码: 我对JMH完全陌生,不确定代码是否正确。 我的基准是正确的吗?你看到任何错误吗? 旁白:请不要建议询问https://codereview.stackexchange.com.对于Codereview,代码必须已按预期工作。我不确定这个基准是否能按预期工作。

  • 我正在使用向服务器发送REST请求的自定义Java库为HTTP服务器编写性能测试。在开始时,我正在执行数据准备阶段,以便获得一个要向服务器发送请求的对象列表。 现在,问题是,我可以使用注释测试可以注入基准函数的参数列表: 问题是,我希望通过Java参数列表实现同样的效果,并避免对它们进行迭代。你能告诉我怎么做吗?

  • 我是JMH的新手。在运行代码并使用不同的注释之后,我真的不明白它是如何工作的。我使用迭代=1、预热=1、fork=1来查看我的代码将执行一次,但事实并非如此。JMH运行我的代码超过100000次,我不知道为什么。那么,如何控制代码调用的时间?下面是我的代码:(我为测试修复了JMHSample\u 01)

  • 我目前有一个JMH基准测试来衡量所有实现相同接口的各种数据结构的性能。基准测试工作正常,但我想为每个基准测试打印一些额外的信息,这些信息描述了我的数据结构在试验前后的状态。 目前,我正在做下面的代码 问题是与JMH的输出混淆。有没有办法避免这种情况,并在JMH完成其试验报告后运行我的打印声明?另一种方法是将其写入一个文件,然后进行合并,但最好得到一个不需要手动合并的报告。