hsi*_*nen 7 java arrays memory-management allocation jvm-hotspot
C malloc
实现通常不分配所请求的精确内存量,而是使用固定大小的内存运行,例如,使用两个幂的大小,因此1025字节的分配实际上需要一个2048字节的段,丢失1023个字节作为slop.
HotSpot是否对Java数组使用类似的分配机制?如果是这样,分配Java数组的正确方法是什么,这样就没有什么了不起?(例如,数组长度应该是2的幂,还是2的幂,减去一些固定的开销量?)
如果您询问语言,答案是:未指定(与C相同)
如果您询问具体实现,请查看该实现.我相信Hotspot的8字节粒度; 即对象大小向上舍入到下一个粒度边界.如果问题是当没有足够的可用堆时堆大小增加,那么它取决于实现,GC设置,堆大小参数等等; 准确回答是不切实际的.
编辑:使用一个小的反射黑客,访问sun.misc.Unsafe类(仅限Oracle JRE),对象引用可以转换为内存地址; 输出两个连续分配的数组的地址以自行检查.
我基本上在这里问了同样的问题:根据JVM的内存粒度确定数组的最佳大小(Answers包括使用Unsafe类检查对象大小的示例)