Java - мы можем сделать наше собственное управление памятью? - PullRequest
4 голосов
/ 02 апреля 2012

Возможно ли выполнить управление памятью самостоятельно. например Мы выделяем кусок памяти вне пространства кучи, чтобы он не подлежал GC. И мы сами заботимся о выделении / освобождении объектов из этого куска памяти.

Некоторые люди указывали на такие фреймворки, как Jmalloc / EHcache. На самом деле я больше хочу понять, как они на самом деле это делают.

Я согласен с некоторым прямым или даже косвенным подходом (например, сначала сериализовать объекты Java).

Ответы [ 4 ]

5 голосов
/ 02 апреля 2012

Вы не можете размещать объекты Java в чужой области памяти, но вы можете отобразить память, например, размещены в собственной библиотеке в прямом ByteBuffer, чтобы использовать его из кода Java.

3 голосов
/ 02 апреля 2012

У меня есть библиотека, которая делает подобные вещи. Вы создаете выдержки, которые могут быть использованы перезаписываемыми объектами или поставленными в очередь событиями. Он отслеживает, где объекты начинаются и заканчиваются. Недостатком является то, что библиотека предполагает, что вы будете циклически обрабатывать все объекты один раз в день или неделю. т.е. нет очистки как таковой. С положительной стороны он очень эффективен, может использоваться в управляемой событиями манере, сохраняться и может быть разделен между процессами. Вы можете иметь сотни ГБ данных, используя только несколько МБ кучи.

https://github.com/peter-lawrey/Java-Chronicle

Кстати: он поддерживает ByteBuffers или использует Unsafe для дополнительной производительности.

3 голосов
/ 02 апреля 2012

Вы можете использовать подход к куче памяти Посмотрите на пример jmalloc

и это также полезная ссылка Разница между включением и выключением кучи

2 голосов
/ 02 апреля 2012

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

Что касается распределения памяти для не-Java структур данных, это возможно и регулярно выполняется нативными библиотеками, и даже есть некоторая поддержка Java (упомянутая в других ответах), с общим предостережением, которое вы можете очень легко самоуничтожиться с ним.

...