我试图通过对它的一些调查来了解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场合中同时作为一个整体进入内存?