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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top