JDK fornisce capacità di allocazione dei cosiddetti ByteBuffer diretti, in cui la memoria viene allocata all'esterno dell'heap Java. Questo può essere utile in quanto questa memoria non viene toccata dal garbage collector e come tale non contribuisce al sovraccarico di GC: questo è molto utile per la proprietà di cose che vivono a lungo come cache.Esempi di forzatura della liberazione della memoria nativa diretta da ByteBuffer è stata allocata, utilizzando sun.misc.Unsafe?
Tuttavia, vi è un problema critico con l'implementazione esistente: la memoria sottostante viene allocata in modo asincrono solo quando il proprietario ByteBuffer è sottoposto a raccolta dei dati inutili; non c'è modo di forzare una deallocazione anticipata. Questo può essere problematico poiché il ciclo GC non è influenzato dalla gestione di ByteBuffers e dato che i ByteBuffer risiedono probabilmente nell'area di memoria di vecchia generazione, è possibile che GC venga chiamato ore dopo che ByteBuffer non è più in uso.
Ma in teoria dovrebbe essere possibile utilizzare direttamente i metodi sun.misc.Unsafe
(freeMemory, allocateMemory): questo è ciò che JDK utilizza per allocare/deallocare la memoria nativa. Guardando al codice, una potenziale preoccupazione che vedo è la possibilità di una doppia liberazione della memoria, quindi vorrei assicurarmi che lo stato venga pulito correttamente.
Qualcuno può indicarmi il codice che esegue questa operazione? Idealmente vorrebbe usare questo invece di JNA.
NOTA: Ho visto this question che è un po 'correlato.
Sembra che le risposte indicate siano valide: here è un esempio di codice di Ricerca elastica che utilizza l'idea. Grazie a tutti!
E 'possibile, trovato in SO anni fa ... guardando ora. (In passato ho finito usando solo una coda circolare di buffer, che nel mio caso ha mantenuto bassa la pressione.) –
Wow, non riesco a trovare nessun buon articolo da nessuna parte in questo momento :( –
Devo ancora vedere un System.gc() essere ignorato, almeno su Sun, che sembra essere comunque l'obiettivo – nilskp