tomcat异常停止,对应的catalina.out的日志结果:
/usr/local/tomcat/bin/catalina.sh: line 434:
2824 Killed
"/usr/local/jdk1.8.0_111/bin/java"
"-Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties"
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m
-XX:MaxNewSize=1024m -Duser.timezone=GMT+8 -Dfile.encoding=UTF8
-Dsun.jnu.encoding=UTF8 -Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Djava.endorsed.dirs="/usr/local/tomcat/endorsed" -classpath
"/usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar"
-Dcatalina.base="/usr/local/tomcat"
-Dcatalina.home="/usr/local/tomcat"
-Djava.io.tmpdir="/usr/local/tomcat/temp"
org.apache.catalina.startup.Bootstrap start
没有报错,没有内存溢出,没有被手动停止,莫名进程killed。
Linux
内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于每个进程的,内核直接回收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commit
memory)的办法来间接利用这部分 “空闲”
的内存,提高整体内存的使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括
swap)的容量,内核(OOM
killer)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子来讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。
内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码 linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()
被触发,然后调用 select_bad_process() 选择一个 “bad” 进程杀掉,如何判断和选择一个 “bad”
进程呢,总不能随机选吧?挑选的过程由 oom_badness() 决定,挑选的算法和想法都很简单很朴实:最 bad
的那个进程就是那个最占用内存的进程。
查看/var/log/messages,用grep检索关键字,被kill的进程号“2824”
Nov 26 16:56:07 ip-192-168-***-*** kernel: [
2824]
0 2824
1215901
358971
787
0
0
java
Nov 26 16:56:07 ip-192-168-***-*** kernel:
Out of memory: Kill process 2824 ( score 385 or sacrifice
child
Nov 26 16:56:07 ip-192-168-***-*** kernel:
Killed process 2824 ( total-vm:4863604kB, anon-rss:1435884kB,
file-rss:0kB
很明显,tomcat就是那个最“bad”的进程。
解决思路很简单,你的server需要加内存了。
参考资料:
http://www.bubuko.com/infodetail-2242190.html
加载中,请稍候......