Java服务异常排查指令

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

你可能感兴趣的:(后端开发)