2012-04-10 18 views
25

BACKGROUND: Ho un progetto Web che utilizza JSP. L'IDE è Eclipse. La configurazione di tomcat è: Pubblica automaticamente quando le risorse cambiano e l'intervallo di pubblicazione è "1 secondo".Cosa fare con spazio PermGen tomcat

Un file di proprietà nella cartella delle classi che ha usato per salvare alcune impostazioni. Può anche essere modificato dinamicamente dal servlet. L'operazione di modifica è attivata dal pulsante di salvataggio nel JSP.

PROBLEMA: dopo diverse operazioni di salvataggio, Tomcat viene fornito con java.lang.OutOfMemoryError: PermGen space.

log dei messaggi

java.lang.OutOfMemoryError: PermGen space 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1815) 
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:872) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1325) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:108) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:58) 
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:297) 
    at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1064) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120) 
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4238) 
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3083) 
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:404) 
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1279) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1571) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1580) 
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1560) 
    at java.lang.Thread.run(Thread.java:662) 
+0

duplicato potenziale. http://stackoverflow.com/questions/88235/how-to-deal-with-java-lang-outofmemoryerror-permgen-space-error – Phani

+3

Ottengo questo errore con Tomcat ogni volta che le persone ridistribuiscono un'applicazione Web ripetutamente, senza riavviare Tomcat . A causa di una perdita associata al processo di caricamento classi, lo spazio permgen diventa un po 'più pieno con ogni redeploy. L'aumento delle dimensioni PermGen ritarderà il punto in cui si esaurisce la memoria, ma in realtà, è necessario garantire la Tomcat viene rimbalzata quando si ridistribuisce una webapp. – Jon

+2

Si prega di leggere l'articolo qui sotto che spiega completamente la configurazione di tomcat per aumentare permGen [Tomcat PermGen Space] (http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/) – Phani

risposta

11

È possibile impostare variabile di ambiente denominata: "JAVA_OPTS" e il valore impostato di esso come segue -Xms256m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m

+0

mentre si fa in modo da non perdere i simboli "-" .. –

+0

Sembra evitare il problema, ma non è una buona soluzione. Dubito che il salvataggio dati di frequente nel file di proprietà è un disegno sbagliato, se è cattivo, che cosa dovrebbe essere – SKing7

+2

E '-Xms256m Xmx1024m realtà. Xms è la dimensione iniziale e Xmx è la dimensione massima dell'heap. –

34

Tomcat ha bisogno di un sacco di PermGen. 512m non è un massimo irragionevole. Tuttavia ritarda solo la perdita di distribuzione a caldo. Permgen crescerà ~ 25mb per hotdeploy, che, in Eclipse, potrebbe essere ogni volta che salvi un file Java. 512m scompare velocemente se hai una contrazione Ctrl + S come me.

La soluzione: consentire a Java di eliminare le definizioni di classe dalla memoria, ad esempio il codice byte di garbage collector. Aggiungere questi con il vostro potenziato PermGen dimensioni:

-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC 
+0

@dldnh puoi per favore menzionare la riga completa che dovrebbe essere aggiunta al file setenv.sh –

5

ambiente come questo:

-Xms128m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m 

enter image description here

0

server Tomcat viene eseguito JAVA diverso e l'eclissi viene eseguito in diversi JAVA.

Quindi aggiungere -XX:MaxPermSize=512m a eclipse.ini aiuterà a risolvere questo problema. Seguire i passaggi di seguito per aggiungere questo al server Tomcat:

  • doppio click del server in Eclipse

  • aperta lancio configurazione

  • add "XX: MaxPermSize = 512m" per argomenti VM nel Scheda Argomenti

6

per Eclipse

  1. Vai proprietà del server
  2. Vai alla piattaforma
  3. ora in discussione VM scrivere questo -Xms256m -Xmx256m -XX: PermSize = 256m -XX: MaxPermSize = 512m

PER N ETBEANS

  1. Vai a Netbeans cartella/etc/
  2. netbeans.config aperto in qualsiasi editor di
  3. modificare questa linea come

netbeans_default_options = "- J-client -J-Xss256m -J-Xms256m -J-XX: PermSize = 256m XX: MaxPermSize = 512m -J-Dapple.laf.useScreenMenuBar = true -J-Dapple.awt.graphics.UseQuartz = true -J-Dsun.java2d.noddraw = vero -J-Dsun.java2d.dpiaware = true -J-Dsun.zip.disableMemoryMapping = true"

Questo è tutto

0

Giusto per aggiungere per Windows, se qualcuno è ancora bloccato: -

  1. file di catalina.bat aperto (che si trova a Apache Tomcat cartella di installazione/bin)
  2. Set JAVA_OPTS come segue all'inizio (prima del suo primo utilizzo in qualsiasi parte del file): -

    set JAVA_OPTS = -Dfile.encoding = UTF-8 -Xms128m -Xmx1024m -XX: PermSize = 64m -XX: MaxPermSize = 256 m

  3. Riavviare Tomcat e il suo fare.

Potete trovare bella spiegazione here

Problemi correlati