大家下午好,
我有一个类,如下所示:
public class Grapheme {
public Grapheme(int[] code_points) {
this.code_points = code_points;
}
int[] code_points;
}
来自link由 bdonlan 提供 below ,据我了解,通常 Grapheme 对象需要 8 个字节用于对象 header ,4 个字节用于变量 code_points
(其类型为引用),以及 4 个字节的填充。
因此,如果我使用代码 new Grapheme(null)
创建 Grapheme 实例,该 Grapheme 实例通常总共需要 16 个字节。由于是否为 16 字节是特定于实现的,因此从这里开始,我将 这个数字 称为 x 字节。
基本上我想知道是否创建了n个字形,将null
传递给所有的构造函数Grapheme(int[])
并将这些字素存储到长度为 n 的数组中,
运行时(用于存储 Grapheme 实例)所需的总内存是否严格 n * x 字节?
或者 JVM 是否有机会尝试进行一些神奇的优化,使所需的内存低于 n * x 字节?
最佳答案
没有。物体的大小是固定的。考虑一下 - 如果 JVM 确实将您的 Graphemes 打包到一个数组中,它们之间没有空格,如果稍后某些代码更改了 code_points
的值,会发生什么?它必须移动所有其他字形,并重写指向其中任何一个的指针。这将对性能造成巨大影响(您可能需要执行完整的 GC 来重写所有这些指针...),并且对于试图弄清楚为什么简单的赋值如此缓慢的程序员来说是完全难以理解的。因此 JVM 不会进行此类优化。
另请注意,您的开销估计有点偏差。根据this page ,对象的开销为 8 个字节,加上任何内部字段的空间,共 12 个字节。然后将其向上舍入为 8 字节的倍数 - 因此,这里的 Grapheme 对象在 32 位平台和 Hotspot JVM 上总共为 16 字节。任何指向 Grapheme 对象的指针都将占用额外的空间(每个指针可能需要 4 个字节)。对象本身不需要空间来存放自己的地址;该内存由其他东西拥有(例如,堆栈帧或另一个对象)。
关于java - JVM 能否优化引用 null(null 类型的实例)所需的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9060033/