пытаясь сохранить объекты Java в непрерывной памяти - PullRequest
8 голосов
/ 25 марта 2009

Я пытаюсь реализовать кеш-подобную коллекцию объектов. Цель состоит в том, чтобы иметь быстрый доступ к этим объектам через локальную область памяти, поскольку я, вероятно, буду читать несколько объектов одновременно. В настоящее время я просто храню объекты в объекте коллекций Java, таких как вектор или deque. Но я не верю, что здесь используется непрерывная память.

Я знаю, что это можно сделать в C, но можно ли это сделать в Java? Эти объекты могут быть различной длины (так как они могут содержать строки). Есть ли способ выделить непрерывную память через Java? Есть ли объект коллекций Java, который будет?

Пожалуйста, дайте мне знать.

Спасибо, JBU

Ответы [ 4 ]

14 голосов
/ 25 марта 2009

Вы не можете заставить это. Если вы распределяете все объекты в быстрой последовательности, они могут быть смежными - но если вы храните их в коллекции, нет гарантии, что коллекция будет локальной для фактических значений. (В коллекции будут ссылки на объекты, а не сами объекты.)

Кроме того, сжатие GC будет перемещать значения в памяти.

Вы действительно профилировали свое приложение и обнаружили, что это узкое место? В большинстве случаев я ожидаю, что другие оптимизации могут помочь вам более надежным способом.

9 голосов
/ 25 марта 2009

Нет, вы не можете гарантировать эту местность ссылки.

Выделив байтовый массив или используя отображенный байтовый буфер из пакетов nio, вы можете получить кусок непрерывной памяти, из которого вы можете декодировать нужные данные (эффективно десериализовать интересующие объекты из этого блока памяти). Однако, если вы неоднократно обращаетесь к одним и тем же объектам, издержки десериализации, скорее всего, потерпят неудачу.

4 голосов
/ 25 марта 2009

Вы уже написали этот код на Java? И если это так, вы это профилировали? Я бы сказал, что вам, вероятно, не нужно беспокоиться о том, что объекты находятся в смежной памяти - JVM лучше справляется с управлением памятью, чем вы в среде сборки мусора.

Если вы действительно беспокоитесь о производительности, возможно, Java не является подходящим инструментом для этой работы, но мой инстинкт инстинкта состоит в том, чтобы сказать вам, что вы слишком рано беспокоитесь об оптимизации и что версия вашего кода на Java , работая с несмежной памятью, вероятно, подойдет вашим потребностям.

0 голосов
/ 25 марта 2009

Я предлагаю использовать HashMap (без потоков) или Hashtable (с резьбой) для вашего кэша. Оба хранят объект в массиве на солнце jvm. Поскольку все объекты в java передаются по ссылке, это должно быть представлено как массив указателей в c. Держу пари, что вы выполняете преждевременную оптимизацию.

Если вам это абсолютно необходимо, у вас есть два варианта:

1) Используйте JNI и запишите его на языке c. 2) Получите БОЛЬШОЙ байтовый буфер и используйте ObjectOutputStream для записи объектов в него. Вероятно, это будет ОЧЕНЬ МЕДЛЕННО по сравнению с использованием хеш-таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...