Tomcat, Java i błąd OutOfMemoryError: Java heap space

Konrad Kowalski
  • Konrad Kowalski
  • 12/03/2013
  • Debian
  • 0 komentarzy
Tomcat Java

Maszyna wirtualna JVM wykorzystywana do uruchamiania aplikacji/apletów napisanych w Javie posiada ograniczenia co do wielkości używanej pamięci. Przy małych aplikacjach (lub aplikacjach dobrze napisanych) domyślne ustawienia są w pełni wystarczające.

Jednakże podczas administracji serwerami aplikacji możemy niekiedy znaleźć się w sytuacji gdy domyślne wartości są nie wystarczające. Objawia się to zazwyczaj w postaci ciągłego „mulenia” aplikacji bądź wyrzucaniu przez aplikację rozmaitych błędów.

Najczęściej w logach Tomcata (przykłady poniżej) możemy znaleźć

Processing of request failed with uncaught exception: Java heap space
java.lang.OutOfMemoryError: Java heap space

Przykład logu:

2012-11-05 12:01:12 org.apache.catalina.core.ContainerBase$ContainerBackgroundProces...
SEVERE: Exception invoking periodic operation:
java.lang.OutOfMemoryError: Java heap space
        at java.nio.ByteBuffer.wrap(ByteBuffer.java:367)
        at java.nio.ByteBuffer.wrap(ByteBuffer.java:390)
        at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:255)
        at java.lang.StringCoding.encode(StringCoding.java:290)
        at java.lang.String.getBytes(String.java:954)
        at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
        at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:243)
        at java.io.File.exists(File.java:750)
        at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1151)

[ERROR] RequestExceptionHandler 
Processing of request failed with uncaught exception: Java heap space
java.lang.OutOfMemoryError: Java heap space
        at org.apache.xerces.xni.XMLString.toString(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanAttribute(Unknown Sour...
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown So...
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispa...
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown...

Aby rozwiązać ten problem musimy zmienić domyślne ustawienia z którymi uruchamiana jest JVM.
Do zmiany ustawień pamięciowych należy użyć opcji –Xms –Xmx.

-Xms - umożliwia określenie minimalnej wielkości pamięci(-Xms512M = minimum 512 MB)  
-Xmx - umożliwia określenie maksymalnej wielkości pamięci (-Xmx1024M = 1024 MB)

W Debianie dla serwera Tomcat ustawienia te możemy zmienić w pliku:

/etc/default/tomcat6

Domyślne opcje w Squeeze’m to 128MB (maksymalna wielkość pamięci)

JAVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"

Aby rozwiązać problem należy zmienić odpowiednie opcje (zwiększenie do 1024MB):

JAVA_OPTS="-Djava.awt.headless=true -Xmx1024M -XX:+UseConcMarkSweepGC"

Możemy również dodać opcję minimum (min 128MB, max 1024 MB):

JAVA_OPTS="-Djava.awt.headless=true -Xms128M -Xmx1024M -XX:+UseConcMarkSweepGC"

Po restarcie Tomcata problem z pamięcią powinien ustąpić.

Dodaj komentarz