GNU/Linux >> Linux Esercitazione >  >> Linux

Differenza tra l'heap Java e l'heap C nativo

Un processo Java consiste fondamentalmente in due diversi spazi di heap.

  • L'heap Java (spazio nuovo, vecchio e permanente)
  • E il cosiddetto heap C nativo.

Quanto sopra è spesso fonte di confusione quando si tratta di errori di OutOfMemory e errori di allocazione. In particolare nella modalità a 32 bit, dove lo spazio di elaborazione complessivo è limitato a 4 GB o addirittura 2 GB a seconda del sistema operativo.

Come accennato in precedenza, la dimensione totale del processo in modalità a 32 bit è limitata a un massimo di 4 GB. Heap Java e heap C combinati, insieme ad altri spazi, ad es. per librerie, thread ecc. non può superare questo limite di 4 GB. Quindi, se aumenti l'heap Java, ad es. aumentando -Xmx/-Xms da 1,5 GB a 2,5 GB, ciò avrà un effetto collaterale significativo sull'heap C. Prima dell'aumento, l'heap C poteva facilmente crescere fino a 2 GB. Dal momento che c'erano 4 GB -1,5 GB =2,5 GB rimasti. DOPO l'aumento dell'heap Java da 1.5gb a 2.5gb abbiamo solo 4gb – 2.5gb =1.5gb rimasti per tutti gli altri spazi. Compreso l'heap C.

Sfortunatamente dipende interamente dall'applicazione quanto devono essere grandi l'heap Java e l'heap C. Sebbene la dimensione dell'heap Java possa essere configurata in modo esplicito, non è possibile farlo per l'heap C. C-heap si espande semplicemente fino a quando la dimensione del processo raggiunge il limite di 4 GB. Quindi è necessario prestare attenzione se si configura l'heap Java troppo grande. Ciò può comportare errori di allocazione dell'heap C. Per esempio. messaggi come questo in genere significano che l'heap C è stato esaurito:

java.lang.OutOfMemoryError: requested 67108872 bytes for Chunk::new. Out of swap space?

Si prega di notare la sintassi C++ con i due punti doppi. O questo:

# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 65544 bytes

In entrambi i casi l'heap C era troppo piccolo. Una soluzione sarebbe stata quella di ridurre l'heap Java. Sì, per diminuire! Ciò avrebbe dato all'heap C più spazio per espandersi. D'altra parte, possiamo ancora colpire il classico Java.lang.OutOfMemoryErrors. Quelli indicano chiaramente una capacità dell'heap Java insufficiente.

Come puoi vedere, se operi in modalità a 32 bit può esserci un conflitto tra Java e C-heap, che potrebbe non essere facile da risolvere. Se tutto fallisce, prendi in considerazione il passaggio a 64 bit, dove il limite della dimensione del processo di 4 GB non sarà più un problema. Informazioni di base:la stessa JVM (Java virtual machine) Hotspot è scritta in C++. Quindi tutte le allocazioni interne JVM avvengono esclusivamente nell'heap C. Ad esempio, quando il GC si attiva per raccogliere oggetti morti nell'heap Java, allocherà spazio nell'heap nativo per eseguire il proprio lavoro.

D'altra parte, tutti gli oggetti Java che vengono allocati da un programma Java finiranno nell'heap Java. L'heap C non verrà toccato.


Linux
  1. Qual è la differenza tra Sudo Su – e Sudo Su –?

  2. Qual è la differenza tra strtok_r e strtok_s in C?

  3. Qual è la differenza tra fsck ed e2fsck?

  4. Qual è la differenza tra `su -` e `su --login`?

  5. Qual è la differenza tra unlink e rm?

Qual è la differenza tra InnoDB e MyISAM?

Qual è la differenza tra Linux e Unix?

La differenza tra .exrc e .vimrc?

La differenza tra "env" e "printenv"?

Che cos'è un hypervisor? Qual è la differenza tra il tipo 1 e 2?

Qual è la differenza tra curl e Wget?