マルチスレッド アルゴリズムのベンチマークを行うために、パラメーター化された測定をセットアップしましたjmh
。かなりの時間が経過すると、測定がエラーでクラッシュします
java.lang.OutOfMemoryError: unable to create new native thread
このアルゴリズムは非常に限られた数のスレッドを作成し、メモリ リークは発生しません。したがって、この質問は、単一のアプリケーション内でそのエラーが発生した人々からの SO に関する他の多くの質問とは異なります。
この問題はjmh
、明らかに、OS (Ubuntu 14.04、64 ビット) または JVM が以前の実行で割り当てられたネイティブ スレッドを適切にクリーンアップしない、長時間にわたる多くの実行に起因しています。
Options
ベンチマークは、オブジェクトが次の方法で構築されるスクリプト (コマンド ラインを使用せずに Eclipse 内) から開始されます。
Options opts = new OptionsBuilder()
.include(".*")
.warmupIterations(5)
.measurementIterations(5)
.jvmArgs("-server", "-Xmx2G")
.forks(1)
.resultFormat(ResultFormatType.CSV)
.output(file.getPath())
.shouldFailOnError(true)
.shouldDoGC(true)
.build();
問題は、並行アルゴリズムがどのように適切にベンチマークされているかということです。測定は特定の方法で実行する必要がありますか? jmh
/JVMに設定された特定のパラメータ? 他の回答で提案されているように、ネイティブスレッドの許容数を増やす必要がありますか、それとも結果に影響しますか?
ナノ秒の精度は厳密には必要ないので、必ずしも必要 jmh
ではありませんが、インターフェイス、精度、および機能が気に入っています。また、問題はそれ自体よりも OS/JVM に関連していると思われjmh
ます。