Hibernate e Tomcat out of memory

DOMANDA:

Sto utilizzando Hibernate sulla mia web application. Dopo un po' che navigo ed effettuo query, il server Tomcat 7 smette di funzionare e ricevo questo errore:


java.lang.OutOfMemoryError: PermGen space
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)

Come posso risolverlo?



RISPOSTA:


L'accoppiata Tomcat e Hibernate funziona molto bene, ma, come tutti i framework/applicazioni installati sul web server richiede alcune piccole configurazioni per settare tutto al meglio.
Come impostazione predefinita, Tomcat assegna pochissima memoria per i processi in esecuzione. E' proprio quello il problema, poca memoria a disposizione e il nostro framework (in questo caso Hibernate) ne richiede di più.
Vediamo come aumentarla.



In Linux:
1. Cerchiamo il file catalina.sh nella cartella di installazione di Tomcat \bin\catalina.sh

2. Aggiungiamo queste righe di codice che impostano le JAVA_OPT in catalina.sh

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8
-server -Xms1536m -Xmx1536m
-XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"


Un esempio di come apparirà il file catalina.sh:

#   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension
#                   (JSSE) installation, whose JAR files will be added to the
#                   system class path used to start Tomcat.
#
#   CATALINA_PID    (Optional) Path of the file which should contains the pid
#                   of catalina startup java process, when start (fork) is used
#
# $Id: catalina.sh 609438 2008-01-06 22:14:28Z markt $
# -----------------------------------------------------------------------------

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m
-Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m
-XX:MaxPermSize=256m -XX:+DisableExplicitGC"


# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
os400=false
darwin=false
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
Darwin*) darwin=true;;
esac

# resolve links - $0 may be a softlink
PRG="$0"
...
...


3. Riavviamo Tomcat e non dovrebbero esserci più problemi (nel caso modificate i valori di "Xms" e "PermSize" in base alle vostre esigenze)



In Windows:

1a. Tramite editor visuale (apriamolo da Start -> Programmi -> Apache Software Foundation -> Apache Tomcat 7.0 -> Configure Tomcat oppure  da riga di comando dalla cartella bin di Tomcat: tomcat7w.exe //ES//tomcat) impostiamo i due valori Initial Memory Pool512Maximum Memory Pool1024 come in figura:

Pannello di configurazione di Tomcat 7


1b. (procedura alternativa) Da riga di comando dalla cartella bin di Tomcat:


tomcat7 //US//Tomcat7 --JvmMx 1024 ++JvmOptions="-XX:MaxPermSize=256m"


2. Riavviamo Tomcat e non dovrebbero esserci più problemi (nel caso modificate i valori di Initial e Maximum memory pool oppure di "Xms" e "PermSize" in base alle vostre esigenze)

Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java