对于堆上和堆外分配。On-heap - 在三个主要垃圾收集器的上下文中:CMS、Parallel Old 和 G1。
目前我知道(或认为我知道)的:
- 所有对象(堆上)分配都四舍五入到 8 字节边界(或 2 的更大幂,由
-XX:ObjectAlignmentInBytes
. - G1
- 对于小于区域大小(1 到 32 MB,可能在堆大小/2048 左右)的堆上分配,没有内部碎片,因为没有必要,因为分配器从不“填充漏洞”。
- 对于区域大小较大的分配,它会将分配向上舍入到区域大小。IE。区域大小 + 1 字节的分配是非常不幸的,它几乎浪费了 50% 的内存。
对于 CMS,我发现的唯一相关信息是
自然旧空间 PLAB 模仿索引空闲列表空间的结构。每个线程预先分配一定数量的每个大小低于 257 个堆字的块(从全局空间分配的大块)。
来自http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html。据我了解,所谓的“全球空间”是主要的旧空间。
问题:
- 上述说法是否正确?
- CMS中主要旧空间的碎片属性是什么?超过“257 个堆字”的分配怎么办?
- Parallel Old GC 如何管理旧空间?
- Hotspot JVM 是使用系统内存分配器进行堆外分配,还是使用特定的分配器重新管理它?
UPD。讨论主题:https ://groups.google.com/forum/#!topic/mechanical-sympathy/A-RImwuiFZE