我的tomcat突然自动关闭。我检查了日志文件,发现它被杀死了消息:
kernel: Killed process 17420, UID 0, (java) total-vm:8695172kB, anon-rss:4389088kB, file-rss:20kB
我运行tomcat的设置是-Xms2048m -Xmx4096m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=1024m
我的系统运行命令" free -m"是:
total used free shared buffers cached
Mem: 7859 7713 146 0 97 1600
-/+ buffers/cache: 6015 1844 Swap: 0 0 0
我使用" top -p"监控程序,结果如下
Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 8048440k total, 7900616k used, 147824k free, 100208k buffers Swap: 0k total, 0k used, 0k free, 1640888k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4473 root 20 0 8670m 2.5g 6568 S 0.0 32.6 71:07.84 java
我的问题是:
1.为什么VIRT = 8670m(" top -p"结果)大于Mem:8048440k,但我的应用程序仍在运行?
为什么我的tomcat被内核杀死?我没有看到任何奇怪的记忆(它与它的运行时相似)
为避免此错误发生,我该怎么办?为什么?
答案 0 :(得分:3)
我所知道的唯一导致内核在Linux中杀死任务的是out of memory killer。 This article from Oracle可能有点近期和相关。
解决方案取决于系统上运行的其他内容。根据您的展示,您的可用内存不到2GB,但您的Java堆最大值大约为4GB。我们不知道的是,在您拍摄快照时,Java堆有多大。如果它的初始2GB,那么你可能会接近极限。此外,根据您的格式,您没有可用作后备的交换空间。
如果系统上有任何其他重要进程,则需要考虑其最大内存使用量。简短的回答是尝试减少Xmx和MaxPermSize,如果可能的话,你必须分析你的负载,看看是否可能或者会导致不合理的GC CPU使用。
一些注意事项:
答案 1 :(得分:1)