gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:09 24 4
gpt4 key购买 nike

我们正在尝试调整一些 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com