2009-03-25 3 views
7

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

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

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

Спасибо, JBU

+2

Что вы будете хранить в непрерывной памяти? –

+2

более быстрый поиск, меньше ошибок страницы – jbu

+0

Было ли это показано с помощью профилирования? –

ответ

14

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

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

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

+1

да, профайл сначала, так что вы не тратите время на исправление того, что не сломано. –

+0

Во второй раз.Если это действительно является узким местом для вашего приложения, вы, вероятно, пишете его на неправильном языке. –

4

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

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

+0

Вы правы, оптимизация должна произойти после правильной реализации и профилирования. Я просто пытался задуматься. Хотя он все еще служит уроком в теории Java. – jbu

8

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

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

+0

, так что это похоже на то, что массив примитивов может храниться в непрерывной памяти, но не в массиве объектов. это верно? – jbu

+1

Массивы смежны - но если у вас есть массив, такой как Foo [], это означает массив ссылок Foo *, а не Foo * objects *. В Java нет пользовательских типов значений. –

-1

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

Если вы обязательно должны иметь это, у вас есть два варианта:

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

+1

Объекты не передаются по ссылкам. Ссылки (и все остальные аргументы тоже) передаются по значению. Там большая разница, и стоит быть точным.

Смежные вопросы