Назад | Перейти на главную страницу

Tomcat 7.0.42 вылетает много раз в день

У меня запущен сервер Tomcat7, и он дает сбой и иногда показывает предупреждение памяти о нехватке места в куче.

Что мне здесь делать?

Мой сервер имеет 4 ГБ ОЗУ, 4 ЦП и работает на 64-разрядной версии ubuntu 12.04 LTS.

Я новичок в Tomcat, поэтому буду благодарен за помощь.

Я хочу использовать tomcat в производстве, вот что я изменил:

web.xml

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>development</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>reloading</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>genStringAsCharArray</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>modificationTestInterval</param-name>
        <param-value>40</param-value>
    </init-param>
    <init-param>
        <param-name>trimSpaces</param-name>
        <param-value>true</param-value>
    </init-param>       
    <load-on-startup>3</load-on-startup>
</servlet>

server.xml

<Connector port="8080" 
            protocol="org.apache.coyote.http11.Http11AprProtocol" 
            connectionTimeout="3000"
            redirectPort="8443"                 
            URIEncoding="UTF-8"
            maxPostSize="0"
            maxThreads="100"            
            enableLookups="false"
            disableUploadTimeout="false"
            maxKeepAliveRequests="-1"
            useBodyEncodingForURI="true"
            compression="on"
            compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 
            />

setenv.sh

export LD_LIBRARY_PATH='$LD_LIBRARY_PATH:/usr/local/apr/lib'

CATALINA_OPTS="
-server 
-Xss1G 
-Xms2G 
-Xmx2G 
-XX:+UseConcMarkSweepGC 
-XX:NewSize=1G 
-XX:+UseParNewGC

-Djava.awt.headless=true 
-Dfile.encoding=UTF-8
-XX:MaxNewSize=1G
-XX:PermSize=1G 
-XX:MaxPermSize=1G
-XX:+DisableExplicitGC


-XX:SurvivorRatio=128 
-XX:MaxTenuringThreshold=0 
-XX:+UseTLAB 
-XX:+CMSClassUnloadingEnabled 
-XX:+CMSIncrementalMode 
-XX:-UseGCOverheadLimit 
-XX:+ExplicitGCInvokesConcurrent 

-Dorg.apache.jasper.runtime.JspFactoryImpl.USE_POOL=true 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=8999 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=true 
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.password.file=/home/grails/apache-tomcat/conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=/home/grails/apache-tomcat/conf/jmxremote.access";
export CATALINA_OPTS;

Создайте дамп кучи при сбое приложения и запустите его с помощью такого инструмента, как Инструмент анализа памяти Eclipse (MAT). Я считаю, что вы также можете создать дамп кучи из JConsole.

Вы можете создать дамп кучи с помощью такого инструмента, как jmap, но обратитесь к документации JRE за точными флагами. Пример использования для создания файла heapdump.bin (может быть любое имя по вашему выбору):

jmap -dump:format=b,file=/path/to/heapdump.bin <pid>

pid это идентификатор процесса Java, запускающего ваше приложение.

Откройте этот файл в MAT, чтобы увидеть использование памяти вашим приложением.

Также начните просматривать журналы сборки мусора. Чтобы включить их, см. «Параметры ведения журнала GC» здесь: http://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html

HTH.