Utilizzo della memoria della mappa FileChannel #
-
22-07-2019 - |
Domanda
Fa FileChannel # map
alloca immediatamente tutta la memoria necessaria per il ByteBuffer
risultante, oppure viene allocata solo su richiesta durante le letture dal buffer?
Ho appena provato a mappare tutti i file da oltre 500 MB in un banale programma di test e ho esaminato l'utilizzo della memoria del processo. (Usando sia Runtime # totalMemory
sia osservandolo nel Monitor di attività di OS X per un processo groovysh.) L'utilizzo della memoria non ha mai superato i 30 MB.
Quindi, un'implementazione Java " hide " parte del suo utilizzo della memoria nelle chiamate native? E se è così, c'è un modo per scoprire quanto costa su OS X?
Soluzione
L'uso della memoria non è mai semplice. Il buffer effettivo utilizzato da FileChannel.map
non fa parte dell'heap Java. In effetti la memoria potrebbe essere condivisa con altri processi. Il file potrebbe non essere nemmeno letto dal disco fino a quando le pagine non vengono toccate.
Altri suggerimenti
Sì. Non fa parte dell'heap. Tuttavia, a seconda del sistema operativo, sarà comunque riservata la memoria. Su OS X, poiché è simile a UNIX, dovresti essere in grado di utilizzare top o ps per verificare la quantità di memoria necessaria.
java.nio.MappedByteBuffer # load attiverà il caricamento di tutto il contenuto del file in memoria (altrimenti è su richiesta):
Questo metodo fa il possibile per garantire che, quando ritorna, * il contenuto di questo buffer è residente nella memoria fisica. Invocando questo * Il metodo può causare un certo numero di errori di pagina e operazioni di I / O * si verificano.