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:
- 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.
La memoria diretta significa che si utilizza la memoria nativa tramite
java.nio.DirectByteBuffer
.Native mucchio significa che l'utilizzo della memoria nativo tramite
unsafe.allocateMemory
o semplicemente fare unmalloc
nel codice JNI.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.
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