2016-02-06 15 views
9

È possibile creare un oggetto di memoria persistente all'esterno della memoria JVM che può essere utilizzato all'interno della JVM come oggetto, in modo che sopravviva al riavvio di JVM?Allocazione della memoria all'esterno di JVM e utilizzo all'interno di JVM

L'idea particolare è che possiamo allocare memoria al di fuori della JVM e quindi utilizzare un'interfaccia JNI per accedere a questa memoria e associare, ad esempio, alcuni array Java con esso.

Qualcuno ha provato a eseguire questo tipo di trucco? Qualsiasi dipendenza dalla piattaforma sarebbe sufficiente.

Ad esempio, questo può aiutare ad eseguire l'ottimizzazione del caricamento del DB in memoria durante il riavvio del processo JVM.

+0

Non sarà certamente possibile assegnarlo a un vero array java, come un 'float []' o così. Ma tu * puoi * usare la memoria allocata esternamente in java, restituendola come diretta [ByteBuffer] (https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html) che era creato tramite JNI con [NewDirectByteBuffer] (https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#NewDirectByteBuffer). Non sono sicuro di come realizzare un sopravvissuto a un riavvio di JVM (e non posso provarlo sensibilmente al momento), ma ** se ** questa parte può essere risolta, un 'ByteBuffer' diretto è probabilmente la strada da percorrere . – Marco13

risposta

10

Sì, questo è completamente possibile, anche senza JNI.

L'idea è di avere un MappedByteBuffer supportato da un "file" sul file system tmpfs. Per esempio. su Linux è possibile utilizzare il punto di montaggio /dev/shm (o /run/shm) per quello.

Le prestazioni di tale MappedByteBuffer saranno le stesse di altri ByteBuffer diretti, ma permetteranno il riavvio della JVM, ovvero è possibile mappare nuovamente questo "file" in una nuova JVM. (Scrivo "file" tra virgolette, perché sembra un normale file per applicazione, ma in realtà è un'area di memoria condivisa che risiede nella RAM). Utilizziamo attivamente questa tecnica per la nostra produzione di cache in memoria.

+0

Questo è davvero fantastico. Grazie mille! – Andremoniy

+0

Linux non è stato menzionato nella domanda .... Quindi questa è una piattaforma specifica - o c'è qualcosa di simile su Windows? – Marco13

+0

@ Marco13 Su Windows è possibile utilizzare un ramdisk ma penso che sia necessario installarlo. –

4

È possibile utilizzare MappedByteBuffer da soli oppure è possibile utilizzare una struttura dati costruita su un MappedByteBuffer in modo che possa essere disponibile al riavvio e persino condivisa tra JVM.

Chronicle-Map ha un archivio di valori-chiave modellato come ConcurrentMap. per esempio. Map<String, YourType>

Chronicle-Queue è un diario di ogni evento nel sistema, ad es. un log che puoi consumare in tempo reale.

Questi sono sia open source che gratuiti e ti consentono di risparmiare tempo su come archiviare e recuperare oggetti da un archivio permanente.

Nota: poiché sono off-heap e persistenti, possono avere dimensioni TB senza influire sui tempi di pausa GC.