..

day20200918-jvm设置&oom相关

·线上jvm配置

-server -Xms4g -Xmx4g -Xss256k
-XX:MaxTenuringThreshold=20
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/heap/dump.hprof
-XX:+PrintGCTimeStamps
-XX:+PrintGCDeatils
-XX:+PrintGCDeatils -Xloggc:/path/gc/gc.log
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1992
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

#-Xms -Xmx               # 要按照实际环境和压力测试结果来配置
#-XX:PermSize=512m       # jdk8后已不用,改为元空间了
#-XX:MaxPermSize=512m    # jdk8后已不用,改为元空间了
#-XX:MetaspaceSize=512   # jdk8后用这个来设置元空间,注意元空间是直接内存,jvm各个内存区域的总和要小于实际环境内存-元空间大小。
#-XX:HeapDumpPath        # 配到路径就好了,如果指定文件名会导致第二次dump时候因为文件存在而dump失败
#-XX:+PrintGCTimeStamps  # 如果配置了Xloggc这个打印时间戳是自动开启的,可以不显示添加
#-jmx                    # jconsole,jvisualvm监控应用情况

 

·oom排查相关

为什么会导致oom?
oom会发生在堆中,栈中,元空间|永久代,直接内存中。
发生在堆中大都是因为yong gc没有回收掉垃圾对象,多轮yong gc后垃圾对象到达old区,频繁的full gc回收不掉垃圾对象,old区被填满。
发生在栈中,大都是因为调用栈太深,栈空间小,或者是递归方法出了问题。
发生在本地方法栈中,原因类似于java栈中。
发生永久代(方法区的一种实现)中,大都是jdk8之前的版本,加载的类库太多有没有设置永久代大小,或者动态代理创建的代理类占用了太多空间。
发生直接内存中,直接内存不归jvm管理,如果jvm各个内存区域的总和大于本机物理内存限制,就会出现OOM异常。

 

oom一般排查流程:
1.通过jps -l 可以看到当前正在执行的java程序,看看待排查的jar是否还在运行,一般oom了jar肯定是死了。
2.看看对应的堆dump文件在不在,在的话可以分析一下dump出来的文件,看看到底是那个对象太多了,给内存撑爆了。
3.不是所有的oom都会dump出来堆内容,在linux操作系统上存在oomkiller,当linux系统空间不足时候会执行oomkiller,oomkiller会根据进程score最高的值杀死进程。通过命令dmesg |grep -E 'kill|oom|out of memory'搜索oomkiller的日志。
4.看看gc日志,或许不用看就知道,里面记录了大量的full gc.
5.看看项目日志,然后就是定位看看具体是那种oom,对症下药。如果是堆oom,又是代码的原因,那就可喜可乐了。

 

·死锁的排查流程,及问题代码定位

1.系统资源不足,线程推进顺序不当,资源分配不当。
2.top看看整机的运行情况(详细的),df看看硬盘情况(硬盘不足会有严重问题),free看内存情况,vmstat看看cpu情况,ifstat看看网卡,iostat看看io情况。
3.一般死锁,cpu100%。先定位进程,在定位线程,然后定位到代码。
方法一:
a.一般通过top就可以定位到出问题的pid
b.通过ps -mp <pid> -o THREAD,tid,time 找出问题进程下面执行时间最长的线程的线程tid,把tid转为16进制小写格式备用。
c.通过jstack <pid> | grep <tid> -A60 打印问题线程执行位置及其后的60行代码。
方法二:
jconsole 找到项目,点击线程选项卡,点击下发检测死锁。
方法三:
jvisualvm 找到项目,点击线程选项卡,如果有死锁会有醒目的红色字体提醒。

 

·系统变慢的排查流程

top看看整机的运行情况(详细的),df看看硬盘情况(硬盘不足会有严重问题),free看内存情况,vmstat看看cpu情况,ifstat看看网卡,iostat看看io情况。
看看是否是数据库的问题。看看慢sql,检查是否有索引失效。

posted @ 2020-09-18 15:24  罗浩楠  阅读(267)  评论(0)    收藏  举报
..