今天,内网测试服务器A总是运行一段时间就服务器进程自行退出了,给出了“Java Result :137”这样的错误码。上网查了一下这个137,感觉没有啥有价值的东西。一开始怀疑项目中的JNI调用崩溃到底层,但是没有看到core.*这样的崩溃日志,同时也没有发现OOM的日志,也没有常见的Java 的堆异常log,关键是同样的环境,另外一台机器B,压力远比这个大,都稳定运行很长时间没有问题。下午又崩溃了两三次,一度怀疑Java是不是有什么bug,不过这个想法立马被我否认了,先从自己找原因。
晚上,处理完手里的其他事,到家都十一点了,觉得这个崩溃解决不了,就没法睡觉。拿起手机,随意搜了一下“JAVA进程无端退出”,看到了一篇博客提出一个运维神指令dmesg(ps:有时候这个真是救命的神指令)可以查到一个进程的异常信息,在故障诊断方面非常有用。抱着死马当活马医的想法,在出问题的机器敲了一下“dmesg -T | grep java”,看到了“memory cgroup out of memory ,processor kill ....”,这下舒了一口气,JVM进程退出的原因算是知道了,被系统杀掉了,难怪看不到log。
不过为什么被杀呢,查了一下cgroup(详情https://blog.csdn.net/huang987246510/article/details/80765628),了解cgroup是Linux提供一种管理系统资源的机制,尤其是控制虚拟机资源或者docker资源有广泛的应用。由于之前知道这个机器A的内存是足够大,为什么内存足够确使用呢。另外一个机器B在同样的JVM虚拟机配置下却可以。通过查询,我发现Docker可以对系统资源进行设置。这里我注意到Docker,猜想这个机器是不是有什么特殊的,这个机器是不是个docker并且限制了内存,但是Java并不能感知到这种限制。想到之前,在通过TOP 观察jav