2017-08-11 82 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