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

Pap*_*sar 10 java jvm jvm-hotspot prefetch java-memory-model

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

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

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

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

Vin*_*igh 7

经过一些研究,最常见的JVM实现(HotSpot)用于 支持预取.但是这已被删除,因为它们没有实用性.感谢@apangin获取错误报告的链接.

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

压缩更深一点..

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

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

最后的答案

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

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

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

  • 同意.Java的要点是你(大多数时候)不必关心这种低级细节; JIT通过数千个项目和人员的经验进行培训,使Java代码运行高效.投入一个地方的时间和精力可以释放数百万开发人员的脑力. (2认同)