2

マルチスレッド アルゴリズムのベンチマークを行うために、パラメーター化された測定をセットアップしました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ます。

4

1 に答える 1

0

実際にメモリ リークがあったことが判明しました。一部のスレッドはwait、結果を共有メモリに書き込んだ後、永遠に残ることがありました。

于 2015-05-18T22:53:35.523 に答える