我们正在尝试调整一些 Oracle JVM 垃圾收集选项,一位开发人员试图使用-XX:PretenureSizeThreshold
它来确保立即将大量对象放入 Tenured。我很确定假设数组大小等于或超过其中所有对象的总大小。
但是在 Java 中,对象数组不只是引用数组吗?即数组中的每个对象,以及数组对象本身,在内存中是分开的并且被垃圾收集器视为分开的?我认为如果有数百万个条目,数组对象仍然可以变得相当大,但如果每个对象都比引用大得多,它不应该接近它“包含”的对象的总大小。
我认为存在混淆,因为 AFAIK,在 C 中:
struct
可能有一个真正存储s的 s 数组struct
。- 也可以有一个指向 s 的指针数组。
struct
我很确定 Java 总是使用 1. 来表示原始类型的数组,总是使用 2. 来表示对象数组,而 C 可以将任何一种用于任何类型......?
如果我使用ArrayList
带有频繁append()
s 的 an 怎么办(就像我们手头的情况一样)?只复制数组,而不复制数组中的对象?另外,当数组被复制时,即使旧数组在 Tenured 中,新数组也会在 Eden 中开始,对吗?