在某些情况下,需要高效的内存来存储大量对象。要在 Java 中做到这一点,您必须使用几个原始数组(见下文为什么)或一个大字节数组,这会产生一点 CPU 开销来进行转换。
示例:您有一个class Point { float x; float y;}
. 现在,您想将 N 个点存储在一个数组中,在 32 位 JVM 上,该数组至少需要 N * 8 个字节用于浮点数和 N * 4 个字节用于引用。所以至少 1/3 是垃圾(这里不计入普通对象开销)。但是,如果您将其存储在两个浮点数组中,一切都会好起来的。
我的问题:为什么 Java 不优化引用数组的内存使用?我的意思是为什么不像在 C++ 中那样直接将对象嵌入到数组中?
例如,标记类 Point final 应该足以让 JVM 看到 Point 类的数据的最大长度。或者这会违反规范吗?在处理大型 n 维矩阵等时,这也会节省大量内存
更新:
我想知道 JVM 理论上是否可以优化它(例如在幕后)以及在什么条件下 - 我不能以某种方式强制 JVM。我认为结论的第二点是它不能轻易完成的原因。
结论 JVM 需要知道的内容:
- 该类需要是 final 才能让 JVM 猜测一个数组条目的长度
- 该数组需要只读。当然,您可以更改值,
Point p = arr[i]; p.setX(i)
但不能通过inlineArr[i] = new Point()
. 否则 JVM 将不得不引入与“Java 方式”相反的复制语义。见阿罗斯的回答 - 如何初始化数组(调用默认构造函数或将成员初始化为其默认值)