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

时间:2015-07-05 19:16:56

标签: java jvm jvm-hotspot prefetch java-memory-model

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

我们有一个数组,它保存对1000个对象中每个对象的引用。

问题

如果我们按顺序遍历数组,那么将预取到CPU的缓存中的是什么?只有数组所包含的引用或者那些引用才会被取消引用,并且对象也会加载到缓存中?

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

1 个答案:

答案 0 :(得分:7)

经过一些研究,最常见的JVM实现(HotSpot)用于 support prefetching。但这has been removed,因为没有实际使用它们。感谢@apangin提供错误报告的链接。

正如@markspace所提到的,对象被重新安排以便在集合期间更容易访问 - 这称为“压缩”,并且存在于HotSpot使用的默认GC中。您不应该担心这些底层细节,因为VM会为您处理这些细节。

进一步深入压缩..

您可能听说过“Stop-The-World” - 当对象图形处于不一致状态时会发生这种情况。正在移动对象,因此线程可能会访问不再存在的对象。有些GC实现被认为是“无间歇”的,例如Shenandoah GC,它使用转发指针允许线程访问最近移动的对象。

关键是,您无需担心对象在内存中的位置,或者该位置与另一个对象的距离。 VM旨在为您处理这些决定。

最终答案

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

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

虽然像我之前说的那样,它是Java;不要担心你不必担心的事情。我不能强调这一点。