Tomcat 7.0.42 вылетает много раз в день
У меня запущен сервер Tomcat7, и он дает сбой и иногда показывает предупреждение о том, что не хватает кучи.
Что мне здесь делать?
Мой сервер имеет 4 ГБ ОЗУ, 4CPU и работает на 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;
1 ответ
Создайте дамп кучи при сбое приложения и запустите его с помощью такого инструмента, как Eclipse Memory Analysis Tool (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
НТН.