1、Java进程异常退出,故障诊断:
dmesg -T | grep java
打印出报错如下:
Out of memory: Kill process 339 (java) score 711 or sacrifice child
Killed process 339 (java) total-vm:3299052kB, anon-rss:1379316kB, file-rss:0kB, shmem-rss:0kB
操作系统(operating system)构建在进程(process)的基础上. 进程由内核作业(kernel jobs)进行调度和维护, 其中有一个内核作业称为 “Out of memory killer(OOM终结者)”, Out of memory killer 在可用内存极低的情况下会杀死某些进程。只要达到触发条件就会激活, 选中某个进程并杀掉。 通常采用启发式算法, 对所有进程计算评分(heuristics scoring), 得分最低的进程将被 kill 掉。因此 Out of memory: Kill process or sacrifice child 和前面所讲的 OutOfMemoryError 都不同, 因为它既不由JVM触发,也不由JVM代理, 而是系统内核内置的一种安全保护措施。
解决办法:
1、最简单的办法就是将系统迁移到内存更大的实例中。
2、通过 OOM killer 调优(见下), 或者做负载均衡(水平扩展,集群)。
3、降低应用对内存的需求。
OOM机制介绍:Linux OOM机制介绍
2、OOM killer 参数可调:
Out of Memory (OOM)指分配了所有可用内存(包括交换空间)的计算状态。默认情况下,这种情况会导致系统恐慌并停止运行。将/proc/sys/vm/panic_on_oom参数设置为0会指示内核在发生OOM时调用oom_killer函数。通常,oom_killer可以杀死不正常的进程,从而使系统存活下来。
[root@nginx04 /]# cat /proc/sys/vm/panic_on_oom
0
可以根据每个进程设置以下参数,从而增强对oom_killer函数杀死哪些进程的控制。它位于proc文件系统的/proc/pid/下,其中pid是进程ID号。
[root@nginx04 /]# cd /proc/9403/
[root@nginx04 9403]# ls
attr auxv clear_refs comm cpuset environ fd gid_map limits map_files mem mounts net numa_maps oom_score pagemap projid_map sched sessionid smaps stat status task uid_map
autogroup cgroup cmdline coredump_filter cwd exe fdinfo io loginuid maps mountinfo mountstats ns oom_adj oom_score_adj personality root schedstat setgroups stack statm syscall timers wchan
[root@nginx04 9403]# cat oom_adj
0
[root@nginx04 9403]# cat oom_score
453
[root@nginx04 9403]# cat oom_score_adj
0
oom_adj:定义一个从-16到15的值,帮助确定进程的oom_score。将oom_adj值设置为-17将禁用该进程的oom_killer。
oom_score:值越高,进程被oom_killer杀死的可能性越大。
提示:
调整后的进程生成的任何进程都将继承该进程的oom_score。例如,如果一个sshd进程受到oom_killer函数的保护,那么由该SSH会话发起的所有进程也将受到保护。这可能会影响oom_killer函数在发生OOM时挽救系统的能力。
3、Java中三种常见内存溢出错误的处理方法
4、垃圾回收次数:
jstat –gc
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC :年轻代中Eden(伊甸园)的容量 (字节)
EU :年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC :Old代的容量 (字节)
OU :Old代目前已使用空间 (字节)
MC:metaspace(元空间)的容量 (字节)
MU:metaspace(元空间)目前已使用空间 (字节)
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
jmap -dump:format=b,file=heap.bin 2724
file是保存的文件名 ,bin 2724是该java进程的PID