当前位置: 首页 > 知识库问答 >
问题:

对象是从Java中的引用数组中预取的吗?

郁权
2023-03-14

想象一下,我们有1000个相同类型的对象分散在内存中(它们是在不同的时间创建的,其他对象是在这两者之间创建的)。

我们有一个数组,其中包含对1000个对象中每个对象的引用。

如果我们依次迭代数组,什么将被预取到CPU的缓存中?只有数组持有的引用,或者这些引用将被取消引用,对象也将被加载到缓存中?

Java(JVM)实现了某种软件预取吗?如果没有,是否有提供软件预取的库?

共有1个答案

曹高轩
2023-03-14

经过一些研究,最常见的JVM实现(热点)用于支持预取。但这已经被删除,因为它们没有实际用途。感谢@apangin提供了bug报告的链接。

正如@markspace所提到的,对象被重新安排,以便在收集过程中更容易访问——这被称为“压缩”,并且出现在HotSpot使用的默认GC中。您不必担心这些底层细节,因为VM会为您处理这些细节。

您可能听说过“停止世界”——这发生在对象图处于不一致状态时。对象被四处移动,因此线程可能访问不再存在的对象。有一些GC实现被认为是“暂停的”,例如谢南多亚GC,它使用转发指针允许线程访问最近移动的对象。

关键是,您不需要担心对象可能位于内存中的位置,或者该位置与另一个对象有多远。VM旨在为您处理这些决策。

那么,对象是从引用数组中预取的吗?你真的不该担心。使用Java不必关心这些底层细节。

如果你真的对这些细节感兴趣(也许你遇到了一些奇怪的错误),正如我之前提到的,它是特定于实现的,你必须具体说明你指的是哪个实现。

虽然,就像我之前说的,它是Java;不要再担心你不需要担心的事情了。这一点我怎么强调都不过分。

 类似资料:
  • 问题内容: 在Java中,我们可以声明一个数组,例如 这是否意味着数组本身是一个对象?因为在C ++中,数组只是一个指针,没有任何方法。 问题答案: Java语言规范的第4.3.1节从以下内容开始: 对象是类实例或数组。

  • 有一个名为的类。 并且我有一个对象的数组。我现在需要的是将该数组中所有对象的s提取到一个新数组中。 我也发现了这个类似的问题。但是它是在Objective-C中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?

  • 我有一个对象只包括一个数组(17)。我想从这个数组中得到特定的值,例如 时,我得到: 最后,在调用this.flights['states'][0][4]时,我收到一个错误: 正在启动我从Opensky网络Api获取的flights对象:

  • 我有这个初始数组,希望根据和提取重复航班 我写了这个,但我只能得到第一个重复的,看起来不是很漂亮。 有什么建议吗?

  • 我得到错误:“com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:Expected BEGIN_OBJECT但是BEGIN_ARRAY位于第1行column 283 path$.items.Promended[0].images” 我请求帮助从json对象提取数据。 我只需要删除类'images',并将'urls'

  • 问题内容: 是否有一种简单的方法可以从对象数组列表中的一个对象的字段中获取最大值? 例如,出于下面的对象,我希望获得“值”字段的最高值。 我想从中获取ValuePairs.mValue的最大值的示例arraylist。 创建存储在arraylist中的对象的类: 我正在通过做类似的事情来获取mValue的最大值(我知道这是不正确的): dMax应该为50.00。 任何帮助表示赞赏。谢谢! 问题答案