2

为了对多线程算法进行基准测试,我设置了参数化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它本身更相关。

4

1 回答 1

0

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

于 2015-05-18T22:53:35.523 回答