加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

tomcat正常运行一段时间后,异常停止,进程被killed的原因与解决思路

(2017-11-30 15:04:33)
标签:

it

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 OOM Killer

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]      2824  1215901   358971     787                   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






  


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有