统计线程的分配内存的大小方法即 cooked_allocated_bytes() 方法的源码如下:
thread.inline.hpp
inline jlong Thread::cooked_allocated_bytes() {
//原子读取 _allocated_bytes
jlong allocated_bytes = Atomic::load_acquire(&_allocated_bytes);
//如果开启了 TLAB(默认开启),则需要查看下当前线程的 TLAB 已经分配的对象大小
if (UseTLAB) {
//统计当前线程的 TLAB 已经分配的大小
size_t used_bytes = tlab().used_bytes();
//如果当前 TLAB 在初始化,或者全局 TLAB 在初始化,会发生 used_bytes > max_size 的情况,忽略这种情况。
if (used_bytes <= ThreadLocalAllocBuffer::max_size_in_bytes()) {
//这样统计其实有可能有点问题,即发生 TLAB retire 的时候,_allocated_bytes 会加上 used_bytes 之后申请一个新的 TLAB,这时候调用这个方法可能会把这个 used_bytes 加了两遍
return allocated_bytes + used_bytes;
}
}
return allocated_bytes;
}