Tag: jmh

可靠地测量JVM分配

我有两个相同的算法的实现。 我想validation他们是否使用了比所需更多的内存,换句话说,他们分配完全相同数量的对象。 我目前的解决方案是通过threadMXBean.getThreadAllocatedBytes(threadId)来测量过程之前和之后分配的字节数,并将其用作内存占用量的近似值。 问题是这个方法是不稳定的,有时它会返回比它应该更多的数字。 它特别显示了不分配对象的算法。 一个有问题的例子是一个总和int[] 。 实际代码(Kotlin): class MemAllocationTest { private val threadMXBean = (ManagementFactory.getThreadMXBean() as? com.sun.management.ThreadMXBean) ?: throw RuntimeException(“Runtime does not support com.sun.management.ThreadMXBean”) /** * May run [block] several times * */ private inline fun measureAllocatedBytes(block: () -> Unit): Long { val threadId = Thread.currentThread().id val before = threadMXBean.getThreadAllocatedBytes(threadId) block() val after = […]

Kotlin的gradle插件不适用于自定义源集(JMH)

拥有Gradle设置的Kotlin项目: apply plugin: 'kotlin' apply plugin: 'kotlin-kapt' dependencies { kapt 'org.openjdk.jmh:jmh-generator-annprocess:1.18' … } 把基准放在src / main / kotlin下工作没有问题。 但是当我为JMH添加一个自定义的源代码集: sourceSets { jmh { compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath } } 并将src / main / kotlin的基准测试版移至src / jmh / kotlin ,执行基准测试失败: Exception in thread "main" java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList at org.openjdk.jmh.runner.AbstractResourceReader.getReaders(AbstractResourceReader.java:98) […]