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