동일한 알고리즘을 두 번 구현했습니다. 나는 그들 중 누군가가 필요 이상으로 많은 메모리를 사용하고 있는지, 즉 정확히 같은 수의 객체를 할당했는지 확인하고 싶다.신뢰할 수있는 JVM 할당을 측정하십시오.
현재의 해결책은 절차 전후에 할당 된 바이트 수를 threadMXBean.getThreadAllocatedBytes(threadId)
을 통해 측정하여 메모리 풋 프린트의 근사치로 사용하는 것입니다.
이 방법은 불안정합니다. 즉, e.i. 때로는 그것보다 훨씬 더 많은 수를 반환합니다. 특히 객체를 할당하지 않는 알고리즘을 보여줍니다. 문제가되는 한 가지 예는 int[]
의 합을 구하는 방법입니다.
실제 코드 (코 틀린) :
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 = threadMXBean.getThreadAllocatedBytes(threadId)
return after - before
}
....
더 나은 솔루션이 있습니까?
(나는 JMH으로 그렇게하는 방법을 모른다, 그러나 이것은 매우 가까운 주제 IMHO)
질문과 직접적으로 관련이 없지만'Thread.currentThread(). id '가'block' 실행 후 어떻게 바뀔 수 있었는지 이해할 수 없습니까? – miensol
@miensol 좋은 질문입니다. 편집 됨, 감사합니다 – voddan