2011-01-31 15 views
73

Innanzitutto, qual è la differenza tra spazio Perm e spazio heap (cosa e in che modo la JVM sceglie di utilizzare ogni spazio di memoria)?Spazio perm contro spazio heap

In secondo luogo, ma soprattutto, quale tipo di rapporto sarebbe consigliato per un'applicazione Java standard di tipo MVC?

risposta

75

L'heap memorizza tutti gli oggetti creati dal programma Java. Il contenuto del mucchio è monitorato dal garbage collector, che libera la memoria dall'heap quando non si usa un oggetto (cioè quando non ci sono più riferimenti all'oggetto.

Ciò è in contrasto con la pila, che memorizza tipi primitivi come int e caratteri, e sono variabili tipicamente locali e valori di ritorno delle funzioni Questi non sono garbage collection

lo spazio perm si riferisce ad una parte speciale del mucchio Visualizza questo SO risposta per una spiegazione:... What is perm space?

+1

Il link che hai detto "segmento dell'heap" - quindi è davvero "una parte speciale dello stack"? Avrebbe molto più senso che fosse una parte dell'heap (o anche una sorta di segmento di dati statici) piuttosto che lo stack che non è adatto per questo genere di cose. –

+1

È una parte speciale dell'heap. Ho modificato la mia risposta prima di commentare, ma apprezzo comunque la correzione :) – Olhovsky

+1

qualche raccomandazione sulla seconda domanda? – Gareth

33

Per dal punto di vista personale, non considererei PermGen una parte speciale del mucchio.

Preferisco di gran lunga pensare all'heap come area di memoria dedicata alle istanze di oggetti di archivio mentre PermGen come area dedicata alle definizioni di classi di archivio. Di conseguenza, il ciclo di vita di un heap è legato a un'applicazione mentre il ciclo di vita di PermGen è legato a una JVM.

Uno dei migliori esempi perché un'applicazione e la sua JVM possono avere un ciclo di vita diverso è in un contenitore Java EE. In un app server, le applicazioni possono essere distribuite e annullate senza riavviare il server. Durante l'undeployment (o ridistribuzione), è facile rilasciare tutte le istanze dell'oggetto, ad esempio lo spazio heap, ma è piuttosto complicato cancellare tutte le classi caricate da questa app da PermGen perché alcune delle classi possono ancora essere referenziate dalla JVM.

Uno di questi casi è il Leaking Drivers. Quando un'app viene distribuita, un driver JDBC viene caricato e registrato con DriverManager. Quando questa app non è distribuita, il DriverManager rimane attivo e contiene un riferimento al driver, il suo caricatore di classe originale e tutto ciò che questo caricatore di classe ha caricato. Di conseguenza, viene creata una perdita di memoria in PermGen, ma non è colpa della gestione della memoria dell'applicazione.

È vero che le JVM come JRocket non dispongono di PermGen, tutto è archiviato in heap. Solo in tale contesto puoi chiamare PermGen una "parte speciale" di heap. Anche in questo caso, dovremmo comunque vedere PermGen e heap in modo diverso poiché hanno uno scopo molto diverso e hanno diversi tipi di perdite di memoria.

Aggiornamento: In Oracle JDK 8, PermGen è replaced by "Metaspace" ed è ora ufficialmente parte del mucchio. Non avremo più bisogno di regolare specificamente PermGen.

0

NON è possibile assegnare nomi alla memoria allocata nell'heap.

Ciò significa che int x (il suo nome) è allocato nello stack. È possibile raggiungere il puntatore con il suo nome, quindi il puntatore si trova nella pila. Non puoi raggiungere l'oggetto con il suo nome, perché non ha un nome. Gli accessi all'oggetto (senza nome) devono essere dal suo puntatore.

Problemi correlati