Java JFR 民间指南 - 事件详解 - jdk.ThreadAllocationStatistics (7)

TLAB retire 对应源码:
threadLocalAllocBuffer.cpp

void ThreadLocalAllocBuffer::retire(ThreadLocalAllocStats* stats) { if (stats != NULL) { accumulate_and_reset_statistics(stats); } if (end() != NULL) { invariants(); //将当前 TLAB 使用的字节数加到 _allocated_bytes //从这里可以看出,如果这个方法和 cooked_allocated_bytes() 同时被调用,可能 used_bytes 被加了两遍。 thread()->incr_allocated_bytes(used_bytes()); insert_filler(); initialize(NULL, NULL, NULL); } }

我们再来看看 JMX 中查看线程分配内存大小的具体实现。首先对应的 JMX 的代码是:

//我们示例中底层调用的实际就是这个方法获取线程分配的内存大小 protected long getThreadAllocatedBytes(long id) { boolean verified = verifyThreadAllocatedMemory(id); if (verified) { //调用 getThreadAllocatedMemory0 获取分配的内存大小 return getThreadAllocatedMemory0( Thread.currentThread().getId() == id ? 0 : id); } return -1; } //getThreadAllocatedMemory0 是一个 native 方法 private static native long getThreadAllocatedMemory0(long id);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydpxz.html