2016-02-06 8 views
9

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

Особая идея состоит в том, что мы можем выделить память вне JVM, а затем использовать интерфейс JNI для доступа к этой памяти и связать, скажем, с некоторым массивом Java.

Неужели кто-то попытается выполнить такой взлом? Любая зависимость от платформы была бы достаточной.

Например, это может помочь в оптимизации загрузки БД в памяти во время перезапуска процесса JVM.

+0

Вы, конечно же, не сможете назначить его реальному массиву java, например 'float []' или так. Но вы * можете * использовать внешнюю выделенную память в java, возвращая ее как прямой [ByteBuffer] (https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html), который был созданный через JNI с помощью [NewDirectByteBuffer] (https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBuffer). Я не уверен, как выполнить выжидательную перезагрузку JVM (и не может разумно попробовать ее в данный момент), но ** если ** эта часть может быть решена, прямой «ByteBuffer», скорее всего, станет , – Marco13

ответ

10

Да, это вполне возможно, даже без JNI.

Идея состоит в том, чтобы иметь MappedByteBuffer с поддержкой «файла» на tmpfs файловой системе. Например. на Linux вы можете использовать /dev/shm (или /run/shm) mountpoint для этого.

Производительность такого MappedByteBuffer будет такой же, как для других Direct ByteBuffers, но она сохранит перезагрузку JVM, т. Е. Вы снова можете сопоставить этот «файл» в новой JVM. (Я пишу «файл» в кавычках, потому что он выглядит как обычный файл для приложения, но на самом деле это область разделяемой памяти, которая находится в ОЗУ). Мы активно используем этот метод для наших кешей памяти в памяти.

+0

Это действительно здорово. Большое спасибо! – Andremoniy

+0

Linux не упоминался в вопросе .... Так что это конкретная платформа - или есть что-то подобное в Windows? – Marco13

+0

@ Marco13 В окнах вы можете использовать ramdisk, но я думаю, вы должны установить это. –

4

Вы можете использовать MappedByteBuffer самостоятельно, или вы можете использовать структуру данных, созданную поверх MappedByteBuffer, чтобы она могла быть доступна при перезапуске и даже совместно использоваться с JVM.

Chronicle-Map имеет хранилище ключей, моделируемое как ConcurrentMap. например Map<String, YourType>

Chronicle-Queue - это журнал каждого события в вашей системе, например. журнал, который вы можете использовать в режиме реального времени.

Это как с открытым исходным кодом, так и бесплатно, и вам нужно решить, как хранить и извлекать объекты из сохраненного хранилища.

Примечание: поскольку они находятся вне кучи и сохраняются, они могут быть размерами TB, не влияя на время паузы GC.