2015-02-10 8 views
5

Elenco dei Garbage Collectors:Quali Java Garbage Collector puliscono PermGen?

  • GC Serial
  • GC parallela
  • parallelo Vecchio GC
  • Conc Mark Sweep GC
  • G1 GC

so che la Conc Mark Sweep GC supporta la pulizia di PermGen quando si abilita l'opzione ClassUnloading JVM. Gli altri Garbage Collector supportano la pulizia di PermGen?

Motivo: Utilizziamo Spring, Hibernate e Groovy che creano un sacco di proxy e Perm Gen diventa grande.

Modifica: Avrei dovuto accennare al fatto che sto usando Java 7. Sono a conoscenza di Java 8 che rimuove Perm Gen e si spera che si aggiorni a volte in futuro. Nel frattempo, la mia domanda è se gli altri garbage collector supportino la pulizia di PermGen oltre a Conc Mark Sweep.

  • GC Serial
  • GC parallela (Credi -server utilizza per default e ha confermato che pulisce perm gen)
  • parallelo Vecchio GC
  • Conc Mark Sweep GC (può pulire perm gen utilizzando JVM bandiera)
  • G1 GC
+1

Se ottieni OOME: Errori di spazio PermGen, è probabilmente dovuto a perdite di memoria, non a un motore GC difettoso. –

+1

È possibile eseguire l'aggiornamento a Java 8, in cui PermGen [è stato rimosso] (http://openjdk.java.net/jeps/122). – Jesper

risposta

3

Tutti gli algoritmi sono pulizia PermGen, ma

    non
  • ogni ciclo di GC includono PermGen pulizia
  • CMS può pulire PermGen concomitanza, G1 sono stati richiedendo stop-the-world GC completa per scaricare classi (pulita PermGen) fino Java 8u40
  • Java 8 hanno metaspace invece di PermGen, ma ha bisogno di essere garbage collection troppo (altrimenti si otterrà OOME in metaspace)

mi batto OOME in PermGen un bel po 'quando mi è stato utilizzato attivamente ClassLoader per simulare JVM multipla in un unico processo per tes t scopi. La mia conclusione: PermGen GC non è molto affidabile. Una corsa funziona come previsto, un'altra lancia OOEM.

+1

Con CMS (abilitato tramite '-XX: + UseConcMarkSweepGC') potrebbe essere necessario aggiungere alcuni parametri JVM per fare in modo che raccolga Garbage. Credo che il più comune sia che vorresti aggiungere '-XX: + CMSClassUnloadingEnabled'. A volte potresti anche aver bisogno di '-XX: + CMSPermGenSweepingEnabled', quindi ti consiglio di aggiungerlo e guardare stdout/stderr durante l'avvio. Concorda anche con la non prevedibilità, almeno con Parallell. CMS e G1 sono stati molto più affidabili per me, mentre lavoravo alla mia libreria [ClassLoader Leak Prevention] (https://github.com/mjiderhamn/classloader-leak-prevention) –