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

时间:2015-06-11 16:29:13

标签: java arrays memory-management allocation jvm-hotspot

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

HotSpot是否对Java数组使用类似的分配机制?如果是这样,分配Java数组的正确方法是什么,这样就没有什么了不起? (例如,阵列长度应该是2的幂,还是2的幂,减去一定量的开销?)

1 个答案:

答案 0 :(得分:5)

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

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

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

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