2017-08-11 7 views
2

私はいくつかのルーチンをベンチマークするためにJava Measurement Harness(JMH)を使用しています。私は各実行の最大ヒープサイズを取得することに興味があります。 JMHのGCプロファイラは割り当て率や解約率などの情報を私に提供しますが、テスト実行中に取得された最大のヒープを探しています。これはできますか?JMHベンチマークのmaxmiumヒープサイズを報告してください

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にそれを追加します:

+0

あなたは方法の単一の実行時に占有ヒープを知りたいのですか?またはベンチマーク全体ですか? – Eugene

+0

シングル@Benchmarkメソッド – ahoffer

+0

を実行すると、それは私の言うことです... '@ベンチマーク 'が*多くの*回呼び出されます。 '@ Benchmark'の*メソッド全体(*すべての呼び出し)を1回だけ呼び出せますか? – Eugene

答えて

0

あなたがあなた自身のプロファイラ実装することができますAggregationPolicy.MAXScalarResultに追加オプションを指定すると

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

を、出力はそれぞれの最大結果になりますベンチマーク実行。ところで

、あなたはメモリとメトリックを行いたい場合は、一つの良い記事あなたが読むことができるがhttps://cruftex.net/2017/03/28/The-6-Memory-Metrics-You-Should-Track-in-Your-Java-Benchmarks.html

+0

私は自分のプロファイラを書きました。私のプロファイラはとても素朴です。 "totalMemory()メソッドを使用して、数秒ごとにヒープサイズをサンプリングします。記事へのリンクありがとうございます! – ahoffer

関連する問題