Di recente mi sono trovato di fronte a questa domanda per i diversi tipi di memoria heap
disponibile in Java
.
Non sono riuscito a trovare molte informazioni online. Esistono diversi tipi di memoria heap
disponibile in Java?
L'heap è diviso Generazione giovane, Generazione vecchia o di ruolo e Generazione permanente.
La Young Generation è dove tutti i nuovi oggetti sono assegnati e invecchiati. Quando la giovane generazione si riempie, questo provoca una raccolta di rifiuti inutili. Le raccolte secondarie possono essere ottimizzate assumendo un alto tasso di mortalità degli oggetti. Una giovane generazione piena di oggetti morti viene raccolta molto rapidamente. Alcuni oggetti sopravvissuti sono invecchiati e alla fine passano alla vecchia generazione.
La Vecchia Generazione è usata per immagazzinare oggetti sopravvissuti. In genere, viene impostata una soglia per l'oggetto di nuova generazione e quando viene raggiunta tale età, l'oggetto viene spostato nella vecchia generazione. Alla fine, la vecchia generazione deve essere raccolta. Questo evento è chiamato un importante garbage collection.
La generazione permanente contiene i metadati richiesti dalla JVM per descrivere le classi e i metodi utilizzati nell'applicazione. La generazione permanente viene popolata da JVM in fase di esecuzione in base alle classi utilizzate dall'applicazione. Inoltre, le classi e i metodi della libreria Java SE possono essere memorizzati qui.
FareriferimentoalladocumentazioneOracleJavaperulterioridettagli:
Mentre le altre risposte forniscono buone informazioni sui dettagli interni di alcuni vari progetti di heap JVM, dal punto di vista del programmatore, c'è solo un heap e un modo per usalo - tramite new
per l'allocazione e lasciando andare la deallocazione.
Quindi, direi che non c'è disponibilità di diversi tipi o aree di un heap Java per i programmatori di cui occuparsi.
Naturalmente, a volte capire come raggiungere l'ultima oncia delle prestazioni JVM per l'applicazione richiede la conoscenza di alcuni di questi dettagli interni.
(Esistono alcune API che supportano i file mappati in memoria, ma generalmente non sono considerati un heap, specialmente nel senso di chiamarli heap Java. Java non assegna oggetti (ad esempio tramite new
) nei file mappati in memoria. )
tl; dr riepilogo:
I couldn't find much information online. Are there different types of
heap
memory available in Java ?
Risposta breve: No.
Risposta leggermente più lunga: la specifica del linguaggio Java non dice nulla sui diversi tipi di memoria heap. Non dice che ci devono essere diversi tipi, non dice nemmeno che non ci devono essere tipi diversi. Gli implementatori sono liberi di scegliere di implementare l'heap nel modo desiderato.
Risposta leggermente sorprendente: la specifica del linguaggio Java in realtà non dice nulla su un "mucchio". Io penso sarebbe possibile creare un'implementazione conforme che non usi un heap.
Risposta lunga:
Ci sono 25 occorrenze del termine "heap" in Specifica della lingua Java .
21 di questi eventi sono il termine composto "heap pollution" , che è solo un nome dato (in origine) da Sun a una situazione particolare in cui il sistema di tipo Java non è sicuro. In realtà non ha nulla a che fare con "the heap":
It is possible that a variable of a parameterized type will refer to an object that is not of that parameterized type. This situation is known as heap pollution.
2 di queste occorrenze sono il termine composto "memoria heap" , che è solo un nome dato da (in origine Sun) a memoria condivisa tra i thread:
Memory that can be shared between threads is called shared memory or heap memory.
Solo 2 delle 25 occorrenze riguardano "l'ammasso". Una di quelle occorrenze è in una sezione non normativa , vale a dire non è in realtà parte delle specifiche.
Questo lascia un solo evento del termine "heap" nell'intera 788 pagine della specifica della lingua Java , ed è nella sezione su come implementare correttamente finalizzazione , menzionata una volta ( grassetto enfasi mia):
Optimizing transformations of a program can be designed that reduce the number of objects that are reachable to be less than those which would naively be considered reachable. For example, a Java compiler or code generator may choose to set a variable or parameter that will no longer be used to
null
to cause the storage for such an object to be potentially reclaimable sooner.Another example of this occurs if the values in an object's fields are stored in registers. The program may then access the registers instead of the object, and never access the object again. This would imply that the object is garbage. Note that this sort of optimization is only allowed if references are on the stack, not stored in the heap.
Questo è l'unico momento in cui viene anche implicato che esiste qualcosa come "l'heap" in Java. E non dice nulla su cosa sia "il mucchio" e certamente non dice nulla su come è organizzato. Non si fa menzione di "diversi tipi di memoria heap" in nessuna parte dell'intera specifica del linguaggio Java, quindi possiamo tranquillamente dire che non è tale come "diversi tipi di memoria heap" in Java.
E ha senso, in realtà: la specifica del linguaggio Java è molto attenta nel omettere dettagli che potrebbero costringere gli implementatori a innovare nell'area delle prestazioni, e la gestione della memoria è certamente un'area che è entrambe le prestazioni -sensibile stesso e ha implicazioni sulle prestazioni per i programmi utente.