2011-07-11 13 views
5

Stiamo spingendo sempre più in alto lo spazio permgen della memoria nella nostra app e sto cercando di scoprire se abbiamo una perdita di qualche tipo nella zona del permgen. Non eseguiamo azioni hot undeploy/redeploy, ma abbiamo molti proxy, sia dinamici che generati da CGLIB. Facciamo anche alcuni complicati bit di classloader per supportare vari casi d'uso, e sospetto che questi potrebbero anche essere un possibile contributo allo spreco di permgen.Perché dovrei vedere solo i classloader "morti" da jmap -permstat (eccetto il bootstrap)?

Quindi eseguo jmap -permstat sulla nostra app in esecuzione, sperando di avere un'idea di ciò che potrebbe riempire il nostro spazio permgen. (Eseguo anche un normale dump dell'heap con entrambi gli oggetti live e dead così posso rintracciare indizi che potrebbero provenire dall'output di permstat).

Tuttavia, tra i 2400 classloader elencati da jmap permstat, TUTTI tranne il classloader bootstrap sono elencati come "morti". Questo non ha senso, dal momento che l'app è sicuramente live e funzionante.

La mia comprensione era che avrebbe jmap segnalare un classloader come "morto" se fosse per la garbage collection, ma devo essere sbagliato qui ...

Che cosa mi manca? Cosa significa "morto" qui? Googling in giro non fornisce molte risposte oltre al possibile malinteso che ho qui.

+1

Questo blogentry potrebbe essere interessante: http://drorbr.blogspot.com/2008/11/javalangoutofmemoryerror-permgen-space.html Morto significa che dovrebbe essere pronto per essere GC'ed (ma ovviamente non sono). Quindi esiste una correlazione più possibile alla perdita. Altrimenti ho visto uno strumento accurato sugli Eclipse-Days per Helios, il MAT. http://eclipse.org/mat Un potente strumento per indagare sulle perdite di memoria. Forse questo aiuta. i migliori saluti, Daniel Leschkowski –

+0

Si prega di inviare il vostro VM versione e java argomenti – jtoberon

+0

java versione "1.6.0_21" Java (TM) SE Runtime Environment (build 1.6.0_21-b06) Java HotSpot (TM) a 64 bit di server VM (build 17.0-b16, modalità mista) – Scott

risposta

1

Qui ci sono alcune idee:

  1. aggiornare all'ultima VM.
  2. Se per qualche motivo si sta eseguendo con -XX:+UseConcMarkSweepGC, quindi assicurarsi che si sta utilizzando anche -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  3. fare un "Catene di riferimento da Rootset" in jhat per vedere chi sta tenendo l'istanza. Ricordarsi di escludere i ref deboli!
  4. This long post è un po 'complicato, e non l'ho provato da solo, ma forse ti aiuterà.
  5. Provare un'altra macchina virtuale, ad es. JRockit