使用参数化'jmh'测量对多线程算法进行基准测试的错误

时间:2015-05-18 16:26:34

标签: java multithreading jvm benchmarking jmh

为了对多线程算法进行基准测试,我设置了参数化jmh测量。经过一段时间后,测量结果出现错误

java.lang.OutOfMemoryError: unable to create new native thread

该算法创建的线程数量非常有限,并且不会泄漏内存。因此,这个问题与那些在单个应用程序中遇到错误的人在SO上的许多其他问题不同。

问题显然源于jmh在很长一段时间内执行的许多执行,显然,操作系统(Ubuntu 14.04,64位)或JVM无法正确清理分配的本机线程在之前的执行中。

基准测试是从脚本(在Eclipse内部,不使用命令行)开始的,其中Options对象的构建方式如下:

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本身有关。

1 个答案:

答案 0 :(得分:0)

事实证明确实存在内存泄漏,其中一些线程在将结果写入共享内存后有时会永远wait