La memoria in un programma C/C++ / Java può essere allocata su stack o heap.
Prerequisito: layout di memoria del programma C.
Allocazione dello stack: L’allocazione avviene su blocchi contigui di memoria. Lo chiamiamo allocazione di memoria dello stack perché l’allocazione avviene nello stack di chiamate di funzione. La dimensione della memoria da allocare è nota al compilatore e ogni volta che viene chiamata una funzione, le sue variabili ottengono la memoria allocata nello stack. E ogni volta che la chiamata di funzione è finita, la memoria per le variabili viene deallocata., Tutto ciò avviene utilizzando alcune routine predefinite nel compilatore. Un programmatore non deve preoccuparsi dell’allocazione della memoria e della deallocazione delle variabili dello stack. Questo tipo di allocazione della memoria noto anche come Allocazione temporanea della memoria perché non appena il metodo termina la sua esecuzione tutti i dati appartengono a quel metodo si scaricano automaticamente dallo stack. Significa che qualsiasi valore memorizzato nello schema di memoria dello stack è accessibile fintanto che il metodo non ha completato la sua esecuzione e attualmente in stato di esecuzione.,
Punti chiave:
- È uno schema di allocazione temporanea della memoria in cui i membri dei dati sono accessibili solo se il metodo( ) che li conteneva è attualmente in esecuzione.
- Alloca o dealloca automaticamente la memoria non appena il metodo corrispondente completa la sua esecuzione.
- Riceviamo il corrispondente errore Java. lang. StackOverFlowError da JVM, Se la memoria dello stack è piena completamente.
- L’allocazione della memoria stack è considerata più sicura rispetto all’allocazione della memoria heap perché i dati memorizzati possono essere accessibili solo dal thread proprietario.,
- L’allocazione e la deallocazione della memoria sono più veloci rispetto all’allocazione della memoria Heap.
- Stack-memory ha meno spazio di archiviazione rispetto alla memoria Heap.,373″>
int
b;
int
n = 20;
int
c;
}
Heap Allocation: The memory is allocated during the execution of instructions written by programmers., Si noti che il nome heap non ha nulla a che fare con la struttura dei dati heap. Si chiama heap perché è un mucchio di spazio di memoria disponibile per i programmatori per allocare e de-allocare. Ogni volta che abbiamo creato un oggetto, crea sempre nello spazio Heap e le informazioni di riferimento a questi oggetti sono sempre memorizzate nella memoria Stack. L’allocazione della memoria dell’heap non è sicura quanto l’allocazione della memoria dello stack perché i dati memorizzati in questo spazio sono accessibili o visibili a tutti i thread. Se un programmatore non gestisce bene questa memoria, può verificarsi una perdita di memoria nel programma.,
L’allocazione della memoria Heap è ulteriormente suddivisa in tre categorie:-Queste tre categorie ci aiutano a dare priorità ai dati(Oggetti) da memorizzare nella memoria Heap o nella Garbage collection.
- Young Generation – È la porzione della memoria in cui vengono creati tutti i nuovi dati(oggetti) per allocare lo spazio e ogni volta che questa memoria è completamente riempita, il resto dei dati viene memorizzato nella Garbage collection.,
- Generazione vecchia o di ruolo – Questa è la parte della memoria Heap che contiene gli oggetti dati più vecchi che non sono in uso frequente o non sono affatto in uso.
- Generazione permanente-Questa è la porzione di memoria Heap che contiene i metadati della JVM per le classi di runtime e i metodi di applicazione.
Punti chiave:
- Riceviamo il messaggio di errore corrispondente se lo spazio Heap è completamente pieno, java. lang.OutOfMemoryError di JVM.,
- Questo schema di allocazione della memoria è diverso dall’allocazione dello Stack-space, qui non viene fornito alcun futuro di deallocazione automatica. Dobbiamo usare un Garbage collector per rimuovere i vecchi oggetti inutilizzati per utilizzare la memoria in modo efficiente.
- Il tempo di elaborazione(tempo di accesso) di questa memoria è piuttosto lento rispetto alla memoria Stack.
- Heap-memory non è anche threaded-safe come Stack-memory perché i dati memorizzati in Heap-memory sono visibili a tutti i thread.
- La dimensione della memoria Heap è abbastanza più grande rispetto alla memoria Stack.,
- Heap-la memoria è accessibile o esiste finché viene eseguita l’intera applicazione(o il programma java).,iv>
*ptr =
new
int
;
}
Mescolati esempio di entrambi i tipi di allocazione di memoria Heap e Stack in java:
di Seguito sono le conclusioni a cui faremo dopo aver analizzato l’esempio di cui sopra:
- Come si avvia l’esecuzione del programma hanno, tutte le classi runtime vengono memorizzati nell’Heap-spazio di memoria.,
- Quindi troviamo il metodo main() nella riga successiva che viene memorizzato nello stack insieme a tutto ciò che è primitivo(o locale) e la variabile di riferimento Emp di tipo Emp_detail verrà memorizzata nello Stack e indicherà l’oggetto corrispondente memorizzato nella memoria Heap.
- Quindi la riga successiva chiamerà il costruttore parametrizzato Emp(int, String) da main( ) e allocherà anche la parte superiore dello stesso blocco di memoria dello stack. Questo memorizzerà:
- Il riferimento all’oggetto dell’oggetto invocato della memoria dello stack.,
- Il valore primitivo(tipo di dati primitivo) id int nella memoria dello stack.
- La variabile di riferimento dell’argomento String emp_name che punterà alla stringa effettiva dal pool di stringhe nella memoria heap.
- Quindi il metodo main chiamerà nuovamente il metodo statico Emp_detail (), per il quale l’allocazione verrà effettuata nel blocco di memoria stack sopra il blocco di memoria precedente.
- Quindi, per l’oggetto appena creato Emp di tipo Emp_detail e tutte le variabili di istanza verranno memorizzate nella memoria heap.
Rappresentazione pittorica come mostrato in Figura.,1 qui sotto:
Fig.1
Differenze chiave tra le allocazioni Stack e Heap
- In uno stack, l’allocazione e la deallocazione vengono eseguite automaticamente mentre, in heap, deve essere eseguita manualmente dal programmatore.
- La gestione del frame Heap è più costosa della gestione del frame stack.
- Il problema di carenza di memoria è più probabile che si verifichi nello stack mentre il problema principale nella memoria dell’heap è la frammentazione.,
- L’accesso allo stack frame è più semplice del frame heap poiché lo stack ha una piccola regione di memoria ed è adatto alla cache, ma in caso di frame heap che sono dispersi in tutta la memoria, causa più errori di cache.
- Uno stack non è flessibile, la dimensione della memoria assegnata non può essere modificata mentre un heap è flessibile e la memoria assegnata può essere modificata.
- L’accesso al tempo di heap richiede più di uno stack.,
tabella di Confronto
Parametro | STACK | HEAP | |
---|---|---|---|
Basic | Memoria viene allocata in un blocco contiguo. | La memoria viene allocata in qualsiasi ordine casuale. | |
Allocazione e Deallocazione | Automatica da istruzioni del compilatore. | Manuale del programmatore.,d>Less | More |
Implementation | Hard | Easy | |
Access time | Faster | Slower | |
Main Issue | Shortage of memory | Memory fragmentation | |
Locality of reference | Excellent | Adequate | |
Flexibility | Fixed-size | Resizing is possible | |
Data type structure | Linear | Hierarchical |