Java 使用参数化';jmh';测量
为了对多线程算法进行基准测试,我设置了一个参数化的Java 使用参数化';jmh';测量,java,multithreading,jvm,benchmarking,jmh,Java,Multithreading,Jvm,Benchmarking,Jmh,为了对多线程算法进行基准测试,我设置了一个参数化的jmh度量。经过一段时间后,测量因错误而崩溃 java.lang.OutOfMemoryError: unable to create new native thread 该算法创建的线程数量非常有限,并且不会泄漏内存。因此,这个问题与这里的许多其他问题不同,因为在一个应用程序中就出现了错误 问题显然源于jmh在很长一段时间内执行的许多执行,很明显,操作系统(Ubuntu 14.04,64位)或JVM没有正确清理以前执行中分配的本机线程 基准测
jmh
度量。经过一段时间后,测量因错误而崩溃
java.lang.OutOfMemoryError: unable to create new native thread
该算法创建的线程数量非常有限,并且不会泄漏内存。因此,这个问题与这里的许多其他问题不同,因为在一个应用程序中就出现了错误
问题显然源于jmh
在很长一段时间内执行的许多执行,很明显,操作系统(Ubuntu 14.04,64位)或JVM没有正确清理以前执行中分配的本机线程
基准测试从脚本(在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
本身有关。事实证明确实存在内存泄漏,一些线程在将结果写入共享内存后,有时会永远等待。请提供一个最小、完整且可验证的示例:请解释?这些是用户线程,即由您自己的代码启动?当forked VM退出时,这些线程应该已经死了,为什么不呢?我想我在测试过程中创建的线程比我最初想象的要多。无论如何,我无法创建问题的最小示例,并相应地编辑了答案。