Java 数组在 HotSpot 中使用内存的精确程度如何(即多少 slop)?

How precisely do Java arrays use memory in HotSpot (i.e. how much slop)?

C malloc 实现通常不会分配所请求的精确内存量,而是消耗固定大小的内存运行,例如具有二次方大小,因此 1025 字节的分配实际上需要一个 2048 字节的段,其中 1023 字节作为 slop 丢失。

HotSpot 是否对 Java 数组使用类似的分配机制?如果是这样,分配 Java 数组以确保没有溢出的正确方法是什么? (例如,数组长度应该是二的幂还是二的幂减去一些固定的开销?)

如果您询问的是语言,答案是:未指定(与 C 相同)

如果您询问的是具体实施,请查看该实施。我相信 Hotspot 的粒度是 8 字节;即对象大小向上舍入到下一个粒度边界。如果问题是关于在没有足够的可用堆时增加堆大小,那么它取决于实现、GC 设置、堆大小参数等;准确回答是不切实际的。

编辑:使用一个小的反射 hack,访问 sun.misc.Unsafe class(仅限 Oracle JRE),对象引用可以转换为内存地址;输出连续分配的两个数组的地址自己查。

我基本上在这里问了同样的问题:Determine the optimal size for array with respect to the JVM's memory granularity(答案包括使用不安全 class 检查对象大小的示例)