大家下午好,
我有一门课是这样的:
public class Grapheme {
public Grapheme(int[] code_points) {
this.code_points = code_points;
}
int[] code_points;
}从bdonlan 链接提供的下面中,我了解到一个图形素对象通常需要8个字节的对象头、4个字节的变量code_points (其类型是引用)和4个字节的填充。
因此,如果我使用代码new Grapheme(null)创建一个字形素的实例,该字形素的实例通常需要总共16个字节。因为它是否是16字节是特定于实现的,所以从这里开始,我将这个数字称为x字节。
基本上,我想知道我是否创建了n个图形位元,将null传递给所有这些图形的构造函数Grapheme(int[]),并将这些图形符号存储到一个长度为n的数组中,
运行时所需的总内存(用于存储图形素实例)是否严格为n*x字节?
或者,是否有可能使尝试进行一些神奇的优化,使所需内存小于n*x字节?
发布于 2012-01-30 06:39:05
不是的。对象的大小是固定的。考虑一下--如果JVM确实将图形符号打包到一个没有空格的数组中,那么如果一些代码后来更改了code_points的值,会发生什么?它必须移动所有其他图形,并重写指向其中任何一个的指针。这将是一个巨大的性能打击(您可能需要执行一个完整的GC来重写所有这些指针.),对于试图找出为什么简单的任务如此缓慢的程序员来说,这是完全无法理解的。因此JVM不进行这类优化。
还需要注意的是,您的开销估计值有点偏低。根据此页,对象的开销为8字节,加上任何内部字段的空间为12字节。然后将其舍入为8字节的倍数,因此在32位平台和Hotspot JVM上,您的图形素对象总共将是16个字节。指向该石墨素对象的任何指针都将占用额外的空间(每个可能占用4个字节)。对象本身不需要为自己的地址留出空间;该内存属于其他东西(例如堆栈框架或其他对象)。
https://stackoverflow.com/questions/9060033
复制相似问题