2017-08-11 79 views
2

我正在使用Java度量工具(JMH)来测试一些例程。我有兴趣获得每次运行的最大堆大小。 JMH的GC Profiler为我提供了分配率和流失率等信息,但我正在寻找测试运行期间获得的最大堆。这可以做到吗?报告JMH基准的最大堆大小

+0

?还是整个基准? – Eugene

+0

Single @Benchmark方法运行 – ahoffer

+0

这就是我说的...... @ @ Benchmark'被调用*很多次。你想要一个方法调用还是* @ Benchmark'的整个*(所有调用)? – Eugene

回答

0

您可以实现自己的探查:

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); 

随着AggregationPolicy.MAX加入ScalarResult的选项,输出将是每一个最​​大结果基准执行。

顺便说一句,如果你想要做的度量与记忆,一个不错的文章,你可以读的是https://cruftex.net/2017/03/28/The-6-Memory-Metrics-You-Should-Track-in-Your-Java-Benchmarks.html你想要的方法的单次运行期间知悉的被占领堆

+0

我的确写过我自己的分析器。我的分析器非常天真。它使用“totalMemory()”方法每隔几秒对堆大小进行一次采样。感谢您的文章链接! – ahoffer