问题描述
在研究java中的数组时,我读到内存使用量包含12个字节的头对象加上特定数据类型元素的存储。但如果最终值不能被 8 字节整除,则需要添加填充。为什么是这样?我试图搜索这个,但没有找到答案。 https://study.com/academy/lesson/java-arrays-memory-use-performance.html#:~:text=The%20memory%20allocation%20for%20an,a%20multiple%20of%208%20bytes。 这是我阅读有关此内容的网站。
解决方法
您在此处指定的详细信息特定于 JVM 的特定实现,通常不需要为真。例如,作为一个多年前的项目,我将一个完全用 JavaScript 编写的 JVM 实现放在一起,该实现依赖于底层 JS 原语,因此无法控制正在创建的对象的确切大小。我不知道我在 JavaScript 中分配的用于表示单个 Java 数组的底层数组对象有多大,而且我当然没有手动填充它。 :-)
正如@cpvmrd 所提到的,JVM 的特定实现可能会出于性能原因(将对象对齐到特定边界以加快 64 位加载)或出于处理器对齐的原因(某些操作如果从不是 N 倍数的地址加载大小为 N 的数据,则会导致性能下降或总线错误。但这取决于实施来解决。
,这是为了性能。
处理器以一定大小(字)的“块”读取内存。在 64 位 CPU 上,内存通常配置为每次地址访问返回一个 64 位字。 Intel CPU 可以在非字边界上执行访问,但存在性能损失,因为 CPU 在内部执行两次内存访问和一次数学运算以加载一个字。