2012-06-16 88 views
0

有没有在java中检查某个特定对象是否在CPU缓存中的方法?有没有一种方法可以测试是否读取/写入其中一个字段会导致缓存未命中?如何检查一个对象是否在CPU缓存中?

我过去写过java程序,但不是很复杂,现在我不得不在java中做一些学术研究。

如果这是不可能的,有没有一种通用的方法来模拟这种事情? 这是可能的低级编程,如C?

+0

Java程序全部运行在虚拟机中...所以简单地说,不。 – Brendan

+2

如果有办法做到这一点,我会非常震惊。这样的细节应该从程序员那里隐藏起来...... –

+1

我不确定这甚至可能在C甚至汇编中。任何“检查”地址的尝试都会自动将其放入缓存中。 – Mysticial

回答

6

TL; DR - 无

在Java的JVM屏蔽从CPU所以这种低层次的信息,通过设计,不暴露在节目。而且,即使你使用低级语言(例如C)并且使用了一些汇编级别的黑客,我也很难想象你可以从哪里获得有关缓存状态的有意义的数据,原因如下:缓存是动态的 - 不断加载新数据,并且(旧的)数据不断从中刷新。在每个给定的时刻,你有几个进程在你的CPU上运行,每个进程至少产生一个线程(可能多于此线程) - 所有这些线程的组合活动都会影响缓存和存储在其中的数据。

因此,即使你能得到问题is object X in cache的Y/N答案,那么这个答案将在你得到它的时候过时。

+0

有没有办法在发生缓存未命中后知道? – Oren

+0

对于它的价值,暂存器内存和MIPS的缓存指令是一些CPU将缓存公开给应用程序的例子。 –

+0

@你可以使用MEM_LOAD_RETIRED.LLC_MISS性能检查缓存未命中。计数器(用于L3缓存)由VTune或任何其他分析器。 – Elalfer

0

正如其他人已经说过的:不。

即使您可以查询缓存中的特定数据,它们也不知道整个对象是否在缓存中,因为在这么低的级别上没有这样的概念。

相关问题