A Giava, gestione della memoria è un processo vitale. È gestito automaticamente da Java. La JVM divide la memoria in due parti: pila memoria e memoria heap. Dal punto di vista di Java, entrambe sono aree di memoria importanti ma entrambe vengono utilizzate per scopi diversi. IL differenza principale tra memoria stack e memoria heap è che lo stack viene utilizzato per archiviare l'ordine di esecuzione del metodo e le variabili locali mentre la memoria heap archivia gli oggetti e utilizza l'allocazione e la deallocazione della memoria dinamica. In questa sezione discuteremo in dettaglio le differenze tra stack e heap.
Memoria dello stack
La memoria dello stack è uno spazio fisico (nella RAM) allocato a ciascun thread in fase di esecuzione. Viene creato quando viene creato un thread. La gestione della memoria nello stack segue l'ordine LIFO (Last-In-First-Out) perché è accessibile a livello globale. Memorizza le variabili, i riferimenti agli oggetti e i risultati parziali. La memoria allocata allo stack dura finché la funzione non ritorna. Se non c'è spazio per creare i nuovi oggetti, lancia il filejava.lang.StackOverFlowError. L'ambito degli elementi è limitato ai relativi thread. IL JVM crea uno stack separato per ogni thread.
Memoria dell'heap
Viene creato all'avvio della JVM e utilizzato dall'applicazione finché l'applicazione è in esecuzione. Memorizza oggetti e classi JRE. Ogni volta che creiamo oggetti, occupa spazio nella memoria heap mentre il riferimento di quell'oggetto crea nello stack. Non segue alcun ordine come lo stack. Gestisce dinamicamente i blocchi di memoria. Ciò significa che non è necessario gestire la memoria manualmente. Per la gestione automatica della memoria, Giava fornisce il garbage collector che cancella gli oggetti che non vengono più utilizzati. La memoria allocata all'heap rimane finché non si verifica un evento, ovvero la chiusura del programma o la memoria libera. Gli elementi sono accessibili a livello globale nell'applicazione. È uno spazio di memoria comune condiviso con tutti i thread. Se lo spazio dell'heap è pieno, lancia il filejava.lang.OutOfMemoryError. La memoria heap è ulteriormente suddivisa nelle seguenti aree di memoria:
- Generazione giovane
- Spazio per i sopravvissuti
- Vecchia generazione
- Generazione permanente
- Cache del codice
L'immagine seguente mostra l'allocazione della memoria dello stack e dello spazio heap.
Differenza tra memoria stack e heap
La tabella seguente riepiloga tutte le principali differenze tra memoria stack e spazio heap.
Parametro | Memoria dello stack | Spazio nell'heap |
---|---|---|
Applicazione | Memorizza oggetti che hanno una vita molto breve come metodi, variabili E variabili di riferimento degli oggetti. | Memorizza oggetti e Java Runtime Environment ( JRE ) classi. |
Ordinare | Ne consegue il LIFO ordine. | Non segue alcun ordine poiché si tratta di un'allocazione di memoria dinamica e non presenta alcun modello fisso per l'allocazione e la deallocazione dei blocchi di memoria. |
Flessibilità | È non flessibile perché non possiamo alterare la memoria allocata. | È flessibile perché possiamo alterare la memoria allocata. |
Efficienza | Esso ha Più veloce accesso, allocazione e deallocazione. | Esso ha Più lentamente accesso, allocazione e deallocazione. |
Dimensione della memoria | È più piccola in misura. | È più grandi in misura. |
Opzioni Java utilizzate | Possiamo aumentare la dimensione dello stack utilizzando l'opzione JVM -Xss. | Possiamo aumentare o diminuire la dimensione della memoria heap utilizzando le opzioni JVM -Xmx e -Xms. |
Visibilità o ambito | Le variabili sono visibili solo al thread proprietario. | È visibile a tutti i thread. |
Generazione di spazio | Quando viene creato un thread, il sistema operativo alloca automaticamente lo stack. | Per creare lo spazio heap per l'applicazione, il linguaggio chiama prima il sistema operativo in fase di esecuzione. |
Distribuzione | Viene creato uno stack separato per ogni oggetto. | È condiviso tra tutti i thread. |
Tiri d'eccezione | JVM lancia il java.lang.StackOverFlowError se la dimensione dello stack è maggiore del limite. Per evitare questo errore, aumentare la dimensione dello stack. | JVM lancia il java.lang.OutOfMemoryError se la JVM non è in grado di creare un nuovo metodo nativo. |
Assegnazione/Deallocazione | Viene eseguito automaticamente da compilatore . | Viene eseguito manualmente da programmatore . |
Costo | Il suo costo è meno . | Il suo costo è Di più rispetto allo stack. |
Implementazione | La sua implementazione è difficile . | La sua implementazione è facile . |
Ordine di assegnazione | L'allocazione della memoria lo è continuo . | Memoria allocata in casuale ordine. |
Sicurezza del filo | È thread-safe perché ogni thread ha il proprio stack. | Non è thread-safe, quindi è necessaria la corretta sincronizzazione del codice. |