了解热点 JVM 进程的内部碎片属性
2022-09-03 15:52:56
对于堆上和堆外分配。堆上 - 在三个主要垃圾回收器的上下文中:CMS,Parallel Old和G1。
我所知道的(或认为我知道的)到现在:
- 所有对象(堆上)分配都向上舍入到 8 个字节边界(或更大的 2 次幂,由 配置)。
-XX:ObjectAlignmentInBytes
- G1
- 对于小于区域大小(1 到 32 MB,可能大约在堆大小 / 2048)的堆上分配,没有内部碎片,因为没有必要,因为分配器永远不会“填补漏洞”。
- 对于大于区域大小的分配,它会将分配向上舍入为区域大小。即分配区域大小+1字节是非常不吉利的,它浪费了近50%的内存。
-
对于CMS,我找到的唯一相关信息是
自然的旧空间PAB模仿索引自由列表空间的结构。每个线程预先分配一定数量的块,每个大小小于 257 个堆字(从全局空间分配的大块)。
从 http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html。据我所知,所称的“全球空间”是主要的旧空间。
问题:
- 上述说法是否正确?
- CMS中主要旧空间的碎片化特性是什么?如果分配超过“257 堆字”呢?
- 如何使用并行旧 GC 管理旧空间?
- 热点 JVM 是使用系统内存分配器进行堆外分配,还是使用特定分配器重新管理它?
UPD。讨论线索:https://groups.google.com/forum/#!topic/mechanical-sympathy/A-RImwuiFZE