我試圖通過對它的一些調查來了解Neo4j對象緩存。對象緩存的第一印象來自此鏈接中的幻燈片: http://www.slideshare.net/thobe/an-overview-of-neo4j-internals瞭解Neo4j對象緩存
具體來說,緩存中的節點/關係對象應該與幻燈片9或15/42類似。爲了驗證這一點,我使用現有圖形數據庫內容編寫了一個簡單的服務器腳本我這樣做的方法是使用sun.misc.Unsafe來查看節點/關係對象的起始虛擬地址。獲得虛擬地址的程序是從以下鏈接: How can I get the memory location of a object in java?
public static long addressOf(Object o) throws Exception {
Object[] array = new Object[] { o };
long baseOffset = unsafe.arrayBaseOffset(Object[].class);
int addressSize = unsafe.addressSize();
long objectAddress;
switch (addressSize) {
case 4:
objectAddress = unsafe.getInt(array, baseOffset);
break;
case 8:
objectAddress = unsafe.getLong(array, baseOffset);
break;
default:
throw new Error("unsupported address size: " + addressSize);
}
return (objectAddress);
}
而在Neo4j的服務器腳本(我的main()類),我按id得到節點地址,並以下列方式打印出來的地址:
void checkAddr(){
nodeAddr(0);
nodeAddr(1);
nodeAddr(2);
}
void nodeAddr(int n){
Node oneNode = graphDb.getNodeById(n);
Node[] array1 = {oneNode};
try {
long address = UnsafeUtil.addressOf(array1);
System.out.println("Addess: " + address);
} catch (Exception e) {
e.printStackTrace();
}
}
首先,我試着用軟緩存提供程序,這是默認情況。地址獲得打印出來用於節點對象0,1和2是:
Addess:4168500044個 Addess:4168502383個 Addess:4168502753
因此,使用第二地址 - 第一地址和第三地址 - 第二個地址,我可以確切知道節點正在佔用多少空間。在這種情況下,第一個節點對象需要2339B,第二個需要370B。
然後,看到禁用對象緩存的影響,我確實有NoCacheProvider設置:
調用setConfig(GraphDatabaseSettings.cache_type,NoCacheProvider.NAME)
的地址獲得打印出來的:
Addess:4168488391 Addess:4168490708個 Addess:4168491056
與第一種情況類似計算的偏移量是:第一個節點對象需要2317B,第二個需要348B。
這裏來我的問題:
由於我使用的是同一張圖,做只讀查詢,爲什麼同一個節點對象的大小變化?
當我禁用對象緩存時,爲什麼地址偏移量看起來像存在對象緩存一樣?例如,在節點存儲文件中,單個節點需要9個字節,這在我的實驗中不是這種情況。如果我得到節點對象的方式有問題,我如何以正確的方式獲得虛擬地址?有什麼辦法可以知道mmap節點文件在內存中的位置?
我怎麼能確切地知道存儲在節點對象中的內容。當我在此鏈接處查看Node.class時: https://github.com/neo4j/neo4j/blob/1.9.8/community/kernel/src/main/java/org/neo4j/graphdb/Node.java 看起來節點對象看起來應該與在演示文稿幻燈片中看起來一樣。而只是一組節點對象使用的函數。進一步是一個節點對象在no-object-cache和with-object-cache場合中同時作爲一個整體進入內存?