Я пытаюсь понять кеш объектов Neo4j, изучив его. Мое первое впечатление от кеша объектов происходит из слайдов по этой ссылке: http://www.slideshare.net/thobe/an-overview-of-neo4j-internalsПонимание кэша объектов Neo4j
В частности, объект Node/Relationship в кеше должен выглядеть как слайд 9 или 15/42. Чтобы убедиться в этом, я написал простой серверный скрипт, используя существующее содержимое базы графиков. То, как я это делаю, пытается заглянуть в начальный виртуальный адрес объекта node/relationship, используя 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 сервера (Мой главный() класс), я получаю адрес узла по идентификатору и распечатать адрес следующим образом :
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();
}
}
Для начала я попробовал использовать Soft cache provider, который является стандартным случаем. Адреса получить распечатан для объекта узла 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 Не похоже, что объект узла должен выглядеть так же, как и в слайдах презентации.Скорее всего, это группа функций, используемых узловым объектом. Кроме того, это объект узла, который сразу же попадает в память как в случае без-объекта-кеша, так и в случае с объектом-кешем?