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.
fonte
2013-06-03 03:13:19
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. –
È una parte speciale dell'heap. Ho modificato la mia risposta prima di commentare, ma apprezzo comunque la correzione :) – Olhovsky
qualche raccomandazione sulla seconda domanda? – Gareth