-
tomcat进程crash20
问题:tomcat在运行过程中会莫名挂掉,表现如被Killed -9,系统中没有任何日志(命令行无Kill指令记录、/var/log/message中无OOM Killer日志、项目本地目录无core dump日志、无java crash日志、应用中记录了eixt操作,日志中没有看到该记录)。不知道大伙儿遇到过这种情况不,有啥建议不?
下面是我排查的情况:
软件环境
$ uname -a
Linux server-224 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/redhat-release
CentOS release 6.3 (Final)
tomcat 7.0.39
$ java -version
java version "1.7.0_15"
Java(TM) SE Runtime Environment (build 1.7.0_15-b03)
测试流程:
crontab中设置每隔15分不断重启tomcat
启动脚本如下:
$ cat notasktest.sh
#!/bin/sh
source /etc/profile
PROJECT="notask"
COUNT=`ps aux|grep java|grep $PROJECT|awk '{print $2}'|wc -l`
if [ $COUNT -le 0 ]
then
echo process not exist
else
cd $project_dir
bin/shutdown.sh
sleep 5
ps aux|grep "java"|grep $PROJECT|awk '{print $2}'|xargs kill -9
sleep 5
bin/startup.sh
fi
启动成功后的进程信息:
/usr/bin/java -Djava.util.logging.config.file=$project_dir/gameserver.notask/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms4096M -Xmx4096M -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:HeapDumpPath=$project_dir/gameserver.notask/log/heap.hprof -Dproject=notask -Djava.rmi.server.hostname=ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1108 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:$project_dir/gameserver.notask/log/gc.log -XX:ErrorFile=$project_dir/gameserver.notask/log/java_error_%p.log -Djava.endorsed.dirs=$project_dir/gameserver.notask/endorsed -classpath $project_dir/gameserver.notask/bin/bootstrap.jar:$project_dir/gameserver.notask/bin/tomcat-juli.jar -Dcatalina.base=$project_dir/gameserver.notask -Dcatalina.home=$project_dir/gameserver.notask -Djava.io.tmpdir=$project_dir/gameserver.notask/temp org.apache.catalina.startup.Bootstrap start
现象:
tomcat进程在启动成功后,可能突然挂掉。效果类似被kill -9
难点:
1、是否挂掉不确定(所以比较难复现,导致很难用回滚法定位问题所在)
2、挂掉时间不确定,有可能刚启动就挂掉,也可能运行一阵子才挂掉。
3、挂掉后,系统中没有任何日志(tomcat自带的日志logs下什么都没有,当前项目目录也什么都没有)
分析:
被kill(系统、其他进程、人为、自身)、 异常(系统、自身)
努力:
1 捕捉未处理的异常
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
UncaughtExceptionHandler old = Thread
.getDefaultUncaughtExceptionHandler();
@Override
public void uncaughtException(Thread t, Throwable e) {
java.io.StringWriter s = new StringWriter(80);
e.printStackTrace(new PrintWriter(s));
logger.error(
"线程异常结束:" + t.getName() + "("
+ Long.toHexString(t.getId()) + ")\n"
+ s.toString(), e);
if (old != null) {
old.uncaughtException(t, e);
}
}
});
2 捕捉代码中的exit
System.setSecurityManager(new MySecurityManager());
//------------------MySecurityManager.java关键代码如下
public class MySecurityManager extends SecurityManager {
@Override
public void checkExit(int status) {
logger.error("严重bug,系统退出!"+ new Exception());
throw new SecurityException("not allow to call System.exit");
}
3 在启动指令中(详情见上)指定了XX:+HeapDumpOnOutOfMemoryError XX:HeapDumpPath=$project_dir/gameserver.notask/log/heap.hprof
Xloggc:$project_dir/gameserver.notask/log/gc.log -XX:ErrorFile=$project_dir/gameserver.notask/log/java_error_%p.log
捕捉堆栈信息、crash信息
4 开启了系统日志
service rsyslog start
5 开启coredump日志
$ ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 62825
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
3.6 通过history查看当时没有命令行执行的指令记录,没看到kill指令
2013年8月12日 16:25
4个答案 按时间排序 按投票排序
-
你的项目有没有调用第三方的dll之类,有的话很有可能是这些dll有异常没有处理,导致jvm挂掉,但jvm日志中应该有些蛛丝马迹的。
2013年8月13日 12:03
-
不知道是不是JVM CRASH,可以查看是否有 hs_err_进程pid的日志文件,如果是jvm crash ,那就分析这个日志,分心core_dump,
可以在http://hllvm.group.iteye.com/group/search?query=crash这个圈子里查找,R大还发有教程
http://vdisk.weibo.com/s/ey7-PRPWlAQ2013年8月13日 11:04
-
看你已经配置了JMX了,建议你先打开JConsole实时的监控一下JVM的状态,尤其是各个代的使用情况,如果有占满的情况可以用jmap抓个快照出来分析一下是什么原因。
再一个就像guazi说的,确认一下是否是系统或人为kill的,不然不会留不下任何日志信息。2013年8月13日 10:55
-
这貌似比较难易排查。
1、如果是jvm问题,应该有日志可以看到,确认一下日志的位置是否有问题?
2、再确认一下是否是系统kill了进程,看看宕机时系统负载情况2013年8月12日 17:21
相关推荐
默认情况下,这些日志文件会被生成在bin目录下(对于Tomcat来说,通常是CATALINA_HOME/bin目录)。但是,我们可以通过Java启动参数来改变这些日志文件的保存位置和命名规则。 例如,我们可以使用以下命令来改变Java...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...