为了对多线程算法进行基准测试,我设置了参数化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
本身有关。
答案 0 :(得分:0)
事实证明确实存在内存泄漏,其中一些线程在将结果写入共享内存后有时会永远wait
。