Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用参数化';jmh';测量_Java_Multithreading_Jvm_Benchmarking_Jmh - Fatal编程技术网

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退出时,这些线程应该已经死了,为什么不呢?我想我在测试过程中创建的线程比我最初想象的要多。无论如何,我无法创建问题的最小示例,并相应地编辑了答案。