2010-05-11 12 views
7
spaventoso

La mia app mostra in aumento la dimensione 'Vecchia generazione'/'Generazione tenificata', e quando raggiunge il limite massimo per 'Vecchia Gen', allora improvvisamente aumenta la dimensione PermGen. Qui sono i miei sizings generazione:Java HotSpot 1.6 VM, Garbage Collection - PermGen

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC 

Questo è su 32 bit Fedora quindi non può avere un mucchio più grande di questo.

L'app non sta facendo alcun elegante caricamento di classe, sebbene stia utilizzando Spring IOC e Hibernate, l'app Spring-context.xml definisce circa 1000 bean.

Questa app inizia con 175 MB PermGen, che aumenta costantemente fino a ~ 250 MB in poche ore, rimane fino a quando la generazione di Tenured raggiunge ~ 780 MB, quindi permgen salta a ~ 500 MB mentre Old Gen scende a ~ 500 MB.

Questo mi costringe a riavviare l'App su base giornaliera, e mi dà un vero spavento di errore OutOfMemory incombente. Qualsiasi approfondimento sarebbe molto utile.

Grazie Gala101

13/Maggio: Qualcuno potrebbe gettare luce su ciò che accade quando 'Old Gen' è garbage collection?
La jvm inserisce le raccolte da "Old Gen" in PermGen?
Il mio picco PermGen arriva solo quando la raccolta avviene da "Old Gen", anche la diminuzione della dimensione di OldGen corrisponde strettamente all'aumento delle dimensioni di PermGen.
PS: Non eseguo alcuna implementazione/distribuzione in tempo reale perché sicuramente mangerò PermGen.
Qui di seguito è uno spanshot corrente dalla mia pagina di monitoraggio: (la parte impegnata aveva appena saltato da ~ 250 MB a 500 MB)

PS Perm Gen 
Type Non-heap memory 
Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K) 
Peak Usage init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K) 
Collection Usage init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K) 
+0

Per quanto ne so il MaxPermSize non può essere superiore a 256 MB ... –

+1

@Bozhidar: Non è vero, la dimensione PermGen può essere molto più grande di quello – skaffman

risposta

2

Seguirò il consiglio di leonm per analizzare cosa ci vuole tanta memoria. Scommetto che hai una qualche brutta perdita di memoria.

Si dice che non si esegue alcuna classe di caricamento di fantasia, ma Hibernate genera alcune classi al volo per te. Utilizzate alcune funzioni AOP (ad esempio dal modulo Spring AOP?).

Fondamentalmente, se si sta esaurendo lo spazio PermGen, sembra che l'applicazione continui a produrre nuove classi (perché sono le classi archiviate in PermGen).

+0

vorrei provare jmap stasera e aggiornamento .. Non usiamo Spring AOP, ma usiamo lotti di fagioli primaverili (che dovrebbero essere singleton, non sono sicuro se questi sono un fattore che contribuisce) .. Inoltre, potresti o qualcuno fare luce su cosa succede quando "Old Gen" la spazzatura è raccolta? La jvm inserisce le collezioni da "Old Gen" in PermGen? Il mio picco PermGen arriva solo quando la raccolta avviene da "Old Gen", diminuisce anche nel formato OldGen corrisponde strettamente all'aumento della dimensione PermGen. – Gala101

0

Usa jmap di fare un dump di memoria prima di riavviare il server e analizzare con Eclipse MAT

0

Permgen viene divulgato se si continua a distribuire/annullare l'app sul server delle app.

Controllare questo collegamento per ulteriori spiegazioni su come questa non è colpa dell'appserver.

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

+0

Non mi ridetto mai su un Tomcat in esecuzione, mi dispiace non averlo menzionato prima – Gala101

+0

PermGen ha per lo più definizioni di classe . Mi chiedo che tipo di applicazione hai? – Ram