2009-04-03 34 views
16

Ho un'applicazione Grails che fa una discreta quantità di creazione e distruzione di oggetti di dominio, e sembra esaurire lo spazio PermGen ad un ritmo molto, molto rapido. Ho fatto le solite modifiche (PermGen a 256M, abilitato GC di classe, ecc.), Ma senza dadi.Risoluzione dei problemi Grails/Groovy memory leaks?

Qualcuno dovrebbe raccomandare alcuni strumenti (e, spero, gratuiti oa bassissimo costo) per risolvere questo tipo di consumo di memoria in Groovy e/o Java? O alcune tecniche che usi per risolvere i problemi di memoria JVM?

Modifica: questo è quando l'applicazione viene distribuita all'interno di Tomcat in modalità produzione; Non ho provato con altri contenitori. Anche così, sarebbe bello avere delle risorse per rintracciare il problema.

+2

come hai fatto a finire risolvere il tuo problema?Usiamo ricercabile e quarzo (tra gli altri plugin) e vediamo che il nostro utilizzo di spazio PERMGEN aumenta praticamente con ogni richiesta. – hvgotcodes

risposta

1

YourKit è uno strumento piacevole che ho utilizzato più volte per diagnosticare problemi di memoria. È commerciale, ma ha una versione di valutazione gratuita disponibile per il debug di One-Shot.

1

Il problema si sta verificando nello sviluppo o nella produzione?

Se sei in fase di sviluppo, ricorda che Grails sta costantemente ricompilando molti aspetti della tua applicazione (non solo le modifiche del Dominio, ma anche i cambiamenti del controller e altre classi). Ho anche problemi di PermGen, ma la maggior parte viene attivata dalla costante ricompilazione dei file su cui sto lavorando. Puoi disattivare questa funzione

http://www.grails.org/FAQ#Q:%20OMG%20I%20get%20OutOfMemoryErrors%20or%20PermGen%20Space%20errors%20when%20running%20Grails%20in%20development%20mode.%20What%20do%20I%20do?

Se sei in produzione, ovviamente hai un problema molto più critico. I problemi di memoria PermGen sono attribuiti a molti dei framework su cui è costruito Grails, inclusi Spring, Hibernate e persino la JVM di Sun. Potresti provare a modificare la dimensione massima dell'heap per il tuo contenitore Web (Tomcat o Jetty).

Si potrebbe anche provare una diversa implementazione della JVM, come Oracle's JRockit, che dovrebbe essere notevolmente migliore nella raccolta dei rifiuti e in altri modi di efficienza. Non l'ho mai provato da solo, ma visto che anch'io sono nel bel mezzo dello sviluppo e dell'ampio progetto di Grails, potrei essere io stesso a cercare soluzioni a questi problemi. In bocca al lupo!

+0

JRockit è un prodotto Oracle http://www.oracle.com/technology/software/products/jrockit/index.html –

+0

Sono in esecuzione in modalità produzione su Tomcat (6.0.18), e in realtà non lo faccio avere una scelta sulla JVM. –

+0

Ho letto che uno dei problemi con la garbage collection in un contenitore Web è che lo stack viene aggiornato solo quando il container viene riavviato. (Il riavvio del contenitore equivale a riavviare il servizio Tomcat, non semplicemente il riavvio di una singola applicazione Web.) –

6

Personalmente mi piace VisualVM. Ci sono sicuramente strumenti più potenti in giro, ma questo ha un buon rapporto usabilità-potenza.

0

Se ciò accade dopo aver ridistribuito a caldo l'applicazione più volte, è possibile che sia interessato da this Grails bug. Lo Tomcat FAQ ha anche diverse possibili cause per le perdite PermGen.

+0

In realtà penso che sia il problema di root (l'app funziona bene in Jetty), ma anche così mi piacerebbe avere una buona risorsa andando avanti per fare questo tipo di debugging. –

10

Hai provato

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

?

Insieme con l'aumentare i soliti noti (-Xmx, -Xms, -XX:PermSize e -XX:MaxPermSize) questo risolto tutti i problemi PermGen sulla nostra produzione Tomcat, che si era verificato abbastanza presto dopo la distribuzione dell'applicazione. Non ho mai visto un'altra eccezione OOM dopo. :-)

+1

eventuali problemi relativi alle prestazioni con questa soluzione? Utilizziamo i plugin ricercabili, controllabili e al quarzo con molti lavori ricorrenti e otteniamo un OOM di PermGen ogni settimana ... – hvgotcodes

Problemi correlati