Pap*_*sar 10 java jvm jvm-hotspot prefetch java-memory-model
想象一下,我们在内存中分散了1000个相同类型的对象(它们是在不同时间创建的,其他对象是在其间创建的).
我们有一个数组,它包含对1000个对象中每个对象的引用.
如果我们按顺序遍历数组,那么将预取到CPU的高速缓存中的是什么?只有数组所包含的引用或这些引用才会被解引用,并且对象也会被加载到缓存中?
Java(JVM)是否实现了某种软件预取?如果没有,是否有提供软件预取的库?
经过一些研究,最常见的JVM实现(HotSpot)用于 支持预取.但是这已被删除,因为它们没有实用性.感谢@apangin获取错误报告的链接.
正如@markspace所提到的,对象被重新排列以便在集合期间更容易访问 - 这称为"压缩",并且存在于HotSpot使用的默认GC中.您不应该担心这些底层细节,因为VM会为您处理.
您可能听说过"Stop-The-World" - 当对象图形处于不一致状态时会发生这种情况.正在移动对象,因此线程可能会访问不再存在的对象.有些GC实现被认为是"无间歇"的,例如Shenandoah GC,它使用转发指针允许线程访问最近移动的对象.
关键是,您无需担心对象在内存中的位置,或者该位置与另一个对象的距离.VM旨在为您处理这些决策.
那么,是否从引用数组中预取了对象?你真的不应该担心它.您使用Java不必关心这些底层细节.
如果你真的对这些细节感兴趣(也许你遇到了一些奇怪的错误),正如我之前提到的那样,它是特定于实现的,你必须具体说明你所指的是哪个实现.
虽然,就像我之前说过的,它是Java; 不要担心你不必担心的事情.我不能强调这一点.