java - Java对象数组是如何使用的?

标签 java c arrays object garbage-collection

我们正在尝试调整一些 Oracle JVM 垃圾收集选项,一位开发人员尝试使用 -XX:PretenureSizeThreshold 来确保立即将大量对象放入 Tenured。我很确定假设是数组大小等于或超过其中所有对象的总大小。

但在 Java 中,对象数组不就是引用数组吗? IE。数组中的每个对象,以及数组对象本身,在内存中都是分开的,并被垃圾收集器视为分开的?我认为如果有数百万个条目,数组对象仍然会变得相当大,但如果每个对象都比引用大得多,它不应该接近它“包含”的对象的总大小。

我认为存在混淆,因为 AFAIK,在 C 中:

  1. 可以有一个真正存储structstruct数组。
  2. 也可以有一个指向结构指针数组。

我很确定 Java 总是将 1. 用于基本类型的数组,并始终将 2. 用于对象数组,而 C 可以将两者用于任何类型......?

如果我使用带有频繁 append()ArrayList 会怎样(正如我们手头的例子)?是否只复制数组,而不复制数组中的对象?另外,当复制数组时,即使旧数组在 Tenured 中,新数组也从 Eden 开始,对吧?

最佳答案

But in Java, aren't arrays of objects just arrays of references?

只是引用。所有对象都分配在堆上,而不是在数组或堆栈上(至少在官方上,优化器可能会尽可能使用堆栈分配,但这是透明的)。

it shouldn't be anywhere near the total size of the objects it "contains" if each object is much bigger than a reference.

是的,在 Java 中,每当您说“分配/存储对象”时,您指的是引用(C 术语中的指针)。

What if I use an ArrayList with frequent append()s (as we are in the case at hand)? Is only the array copied, and not the objects in the array?

数组仅在需要调整大小时才被复制,即很少,摊销成本与插入次数成正比。 引用的对象永远不会被复制。

Also, when the array is copied, even if the old array was in Tenured the new one starts in Eden, right?

是的!

关于java - Java对象数组是如何使用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410875/

相关文章:

java - java中可滚动的JPanel

java - Maven 项目未构建

c - Unix - 异步读取 (aio_read)

java - JSONArray 解析错误

php - 在数组中的两对之间添加键/值对

java - SOLR:没有可用的核心

java - 是否可以在单个 Rest 服务调用中检索 Image 和 JsonObject?

c - 在 C 中使用嵌套循环查找数组中的三个相同数字

c - 指令 mov %edi 和 mov %rsi 有什么作用?

JavaScript 数组转换