2012-06-16 110 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

正如其他人已經說過的:不。

即使您可以查詢緩存中的特定數據,它們也不知道整個對象是否在緩存中,因爲在這麼低的級別上沒有這樣的概念。

相關問題