2015-06-03 19 views
6

Recentemente mi sono imbattuto in questi concetti mentre imparavo gli interni di JVM. Sono consapevole che ci sono già un sacco di domande su SO su di loro individualmente, ma non riesco ancora a cogliere la relazione tra loro o, semplicemente, quali sono.off-heap, heap nativo, memoria diretta e memoria nativa

Ora io li descrivono come tali:

  1. memoria nativa si intende la zona di memoria esterna normale heap JVM, ma ancora all'interno della memoria totale spazio utente risparmiato dal sistema operativo per il processo di JVM (ad esempio su 32- bit Windows è di default 2 GB). Questo spazio è riservato da JVM per memorizzare alcuni dati interni, ad esempio Area di generazione/metodo permanente ecc.
  2. La memoria diretta significa che si utilizza la memoria nativa tramite java.nio.DirectByteBuffer.

  3. Native mucchio significa che l'utilizzo della memoria nativo tramite unsafe.allocateMemory o semplicemente fare un malloc nel codice JNI.

  4. Off-heap è uguale alla memoria nativa.

E una domanda aggiuntiva, è possibile allocare memoria direttamente all'esterno dello spazio di memoria totale (4GB da 32-bit OS) risparmiato per il processo JVM?

Indicare gli errori nella mia comprensione e, se possibile, fornire una descrizione chiara su di essi.

risposta

6

1) Heap memoria: memoria nel processo JVM gestita dalla JVM per rappresentare oggetti Java

2) memoria nativo/Off-mucchio: è memoria allocata all'interno dei processi indirizzo spazio non è nel mucchio.

3) Memoria diretta: è simile a nativo, ma implica anche la condivisione di un buffer sottostante nell'hardware. Ad esempio il buffer all'interno della scheda di rete o del display grafico. L'obiettivo qui è quello di ridurre il numero di volte in cui gli stessi byte vengono copiati in memoria.

Infine, a seconda del sistema operativo, è possibile eseguire allocazioni extra native (assegnazione dello spazio di indirizzamento della memoria) tramite allocazione non sicura e/o mappatura della memoria di un file. La mappatura della memoria di un file è particolarmente interessante in quanto può facilmente allocare più memoria di quella che la macchina ha attualmente come RAM fisica. Si noti inoltre che il limite dello spazio di indirizzamento totale è limitato dalla dimensione di un puntatore utilizzato, un puntatore a 32 bit non può superare i 4 GB. Periodo.

+0

Sto davvero cercando di capire la segmentazione della memoria fornita da java e dal sistema operativo. Ora che OS ha diviso lo spazio degli indirizzi del processo in più segmenti come il testo dei dati dello stack, anche la memoria del processo JVM avrà questa segmentazione fornita dal sistema operativo. Ora, quando JVM avvia l'esecuzione del programma JAVA (JVM), fornisce nuovamente una segmentazione simile al programma java. Ora sono davvero confuso tra questi due tipi di segmentazione della memoria, forniti dal sistema operativo e forniti da JVM al programma java. Potete per favore aiutarmi a capire questo. – vvtx

1

E una domanda aggiuntiva, è possibile allocare memoria direttamente al di fuori dello spazio di memoria totale (4 GB su OS a 32 bit) risparmiata per il processo JVM?

4 GB è il limite di spazio di indirizzi virtuali totali per un processo su un sistema operativo a 32 bit. I puntatori a 4 byte semplicemente non possono affrontare più di questo.

L'unica cosa che si può fare è aprire un file di grandi dimensioni e interagire con esso attraverso una quantità limitata di buffer mappati in memoria, mapparli e rilasciarli secondo necessità e sperare che la cache della pagina del SO li tenga nella memoria fisica.

Se sono necessari più di 2 GB di memoria, è consigliabile utilizzare un sistema operativo a 64 bit e JVM.