GeeksforGeeks (Italiano)

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

  1. In uno stack, l’allocazione e la deallocazione vengono eseguite automaticamente mentre, in heap, deve essere eseguita manualmente dal programmatore.
  2. La gestione del frame Heap è più costosa della gestione del frame stack.
  3. Il problema di carenza di memoria è più probabile che si verifichi nello stack mentre il problema principale nella memoria dell’heap è la frammentazione.,
  4. 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.
  5. Uno stack non è flessibile, la dimensione della memoria assegnata non può essere modificata mentre un heap è flessibile e la memoria assegnata può essere modificata.
  6. 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

Article Tags :

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *