Skip to content

Latest commit

 

History

History
executable file
·
95 lines (53 loc) · 4.93 KB

090_tipi_memoria.md

File metadata and controls

executable file
·
95 lines (53 loc) · 4.93 KB

La gestione della memoria

La gestione della memoria in Java è affidata al Garbage Collector (GC), un componente del Java Virtual Machine (JVM) responsabile della liberazione della memoria da oggetti non più referenziati. La gestione automatica della memoria è uno dei principali vantaggi di Java, in quanto allevia lo sviluppatore dal compito di liberare manualmente la memoria allocata.

Ecco alcuni concetti chiave relativi alla gestione della memoria in Java:


1. Heap Memory:

  • La memoria heap è la regione di memoria in cui vengono allocate le istanze degli oggetti Java.
  • Gli oggetti in heap persistono per la durata di vita dell'applicazione o fino a quando vengono rilasciati dal Garbage Collector.

2. Stack Memory:

  • La memoria stack è utilizzata per conservare i dati locali e i riferimenti ai metodi.
  • Le variabili locali e i riferimenti agli oggetti vengono memorizzati nello stack.
  • Lo stack è più veloce rispetto all'heap, ma ha una dimensione limitata.

3. Garbage Collector:

  • Il Garbage Collector individua e rimuove gli oggetti non più referenziati per liberare memoria.
  • Utilizza vari algoritmi per determinare quali oggetti possono essere considerati "spazzatura".
  • I principali algoritmi GC includono il Garbage-First Collector (G1), il Parallel Collector e il CMS Collector.

4. Ciclo di Vita degli Oggetti:

  • Creazione: Gli oggetti vengono creati utilizzando l'operatore new o altri meccanismi come la reflection.
  • Utilizzo: Gli oggetti vengono utilizzati nel programma, accedendo ai loro metodi e attributi.
  • Referenziamento: Gli oggetti vengono referenziati da variabili, strutture dati o altri oggetti.
  • De-referenziamento: Quando un oggetto non è più referenziato, può essere candidato alla raccolta.
  • Raccolta: Il Garbage Collector rileva gli oggetti non referenziati e li libera.

5. Metodi finalize() e Object.finalize():

  • La classe Object fornisce un metodo finalize() chiamato dal GC prima che un oggetto venga rimosso.
  • È sconsigliato affidarsi esclusivamente a finalize() per la pulizia delle risorse, e si preferisce l'uso di costruttori e blocchi try-with-resources.

6. Risorse Non in Heap:

  • Le risorse esterne come connessioni di database o file devono essere chiuse esplicitamente dal programmatore per evitare perdite di memoria.
  • L'uso di blocchi try-with-resources (introdotti in Java 7) semplifica la gestione delle risorse.

7. Monitoraggio della Memoria:

  • Strumenti come Java VisualVM o strumenti di profilazione possono essere utilizzati per monitorare l'utilizzo della memoria e individuare eventuali perdite.

8. Garbage Collection Esplicita:

  • Mentre il GC opera automaticamente, è possibile richiedere esplicitamente la raccolta dei rifiuti tramite System.gc(). Tuttavia, ciò non garantisce che la raccolta venga effettuata immediatamente.

La gestione automatica della memoria in Java semplifica la vita dello sviluppatore, ma è importante scrivere codice efficiente per minimizzare la pressione sul Garbage Collector e garantire le migliori prestazioni. Evitare la creazione inutile di oggetti, liberare risorse esterne e monitorare l'utilizzo della memoria sono pratiche importanti per un'applicazione Java robusta e performante.

Le classi e gli elementi statici in Java sono memorizzati nello spazio di memoria condiviso chiamato "Metaspace" (prima di Java 8 era chiamato "PermGen" per Permanent Generation).


Classi Statiche

Le classi sono memorizzate in Metaspace. Ogni classe Java, inclusi i suoi metodi e i relativi metadati, viene rappresentata da un oggetto chiamato "java.lang.Class". Questi oggetti Class vengono conservati nello spazio Metaspace.


Elementi Statici

Le variabili e i metodi statici appartengono alla classe, non a un'istanza specifica della classe. Pertanto, la memoria per le variabili statiche e i metodi statici è associata alla classe stessa e non agli oggetti istanza. Questa memoria è anch'essa situata nello spazio Metaspace.


Metaspace

Metaspace è una regione di memoria separata dall'heap principale in cui vengono memorizzati i dati relativi alle classi, ai metodi e ad altre informazioni di runtime. A differenza della vecchia PermGen, Metaspace è dinamicamente ridimensionabile e non soggetto a limiti statici come PermGen.


Memoria Heap

Mentre Metaspace è utilizzato per memorizzare informazioni relative alle classi e ai metodi, la memoria heap è responsabile per la memorizzazione delle istanze degli oggetti. Ogni volta che si crea un nuovo oggetto mediante l'operatore new, la memoria per quell'oggetto viene allocata nello spazio heap.

In sintesi, le classi e gli elementi statici sono memorizzati nello spazio Metaspace, una regione di memoria separata dallo spazio heap utilizzato per le istanze degli oggetti. L'utilizzo di Metaspace consente una gestione più dinamica e flessibile rispetto alla vecchia PermGen.