gpt4 book ai didi

java - ThreadMXBean#getThreadAllocatedBytes 会返回分配的内存或对象的大小吗?

转载 作者:行者123 更新时间:2023-12-04 08:27:58 26 4
gpt4 key购买 nike

我要招聘com.sun.management.ThreadMXBean做这样的事情:

long before = threadMxBean.getThreadAllocatedBytes(currentThreadId);
seriousBusiness(); // some calls here
long after = threadMxBean.getThreadAllocatedBytes(currentThreadId);
long allocDiff = after - before; // use for stats or whatever

问题是,这个方法实际上返回了什么:方法调用时分配的新内存量或分配对象的大小?要清楚我的意思是什么区别:

1) 假设我在 seriousBusiness() 中分配了一个巨大的数组调用,因此为此分配了一个新的内存区域和 getThreadAllocatedBytes增加相应的值。

2) 过了一段时间,有一次 GC 运行,未使用的数组被收集,内存区域现在​​是空闲的。

3)我又做了一些调用(在同一个线程中),JVM发现它不需要分配新的内存并为新的目的重用该内存区域,结果是 getThreadAllocatedBytes值(value)没有增长。

我可能不太清楚 JVM 内存管理如何工作,但问题应该很清楚。

此外,如果第一个假设是正确的(只是新的内存分配计数),那么正确的做法是什么 per-thread object allocations / memory footprint测量?

更新。我试着自己检查: http://pastebin.com/ECQpz8g4 . (sleeps in the code是为了让我用JMC连接JVM)。

TL;DR:分配一个巨大的 int 数组,然后对其进行 GC,然后分配一些新对象并检查分配的内存。这是我得到的:

enter image description here
所以,看起来 GC 确实运行了,虽然内存肯定被分配并随后被释放,但我得到了这个输出:
665328          // before everything started
4295684088 // 4 GiB allocated
4295684296 // did GC (for certain! (really?))
5812441672 // allocated a long string, took new memory

所以,我只是在等待具有 JVM 内存专业知识的人告诉我我是对还是错了。

最佳答案

引用 ThreadMXBean ,它代表目标线程报告在堆中分配的字节数,但暗示这相当于分配的对象的大小。不过有一个警告:

The returned value is an approximation because some Java virtual machine implementations may use object allocation mechanisms that result in a delay between the time an object is allocated and the time its size is recorded



因此,我假设堆空间的回收对报告的值没有影响,因为它只报告分配的绝对字节数,所以如果你分配 100 个字节,那么 80 个字节被回收,然后你再分配 100 个字节,在这些事件结束时报告的 (delta) 值为 200 字节,尽管净分配仅为 120。

关于java - ThreadMXBean#getThreadAllocatedBytes 会返回分配的内存或对象的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36176593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com