系统崩溃了, 所有请求超时
看系统cpu :
top
1
查看系统cpu使用 。
top -H -p pid # 查看java检查中线程使用情况 。 如:top -H -p 13310
发现很多线程cpu使用率为100%。
出现的第一列pid 是线程id 如 13333,将其转16进制 : 3415
查看进程13310中的线程号为3415的线程
./jstack 13310 |grep -A 50 3415 # nid 就是线程id 。
"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007f26f8067800 nid=0x3415 runnable
检查所有线程
./jstack 13310 >> 123.txt
jstat -gcutil 13310 # 查看gc总共消耗时间
jstat -heap 13310 # 版本不一致还是啥问题, 查看不了
生成dump
./jmap -dump:file=ipt.dump 13310
由于服务dump 已经到了8g,不好查看处理
java项目启动参数:
//指定GC文件输出路径
‐Xloggc:./gc‐%t.log
//开启打印GC日志
‐XX:+PrintGCDetails
//打印GC的日期与时间
‐XX:+PrintGCDateStamps
‐XX:+PrintGCTimeStamps
//打印GC原因
‐XX:+PrintGCCause
//使用滚动日志打印,一共20个文件,每个文件100M
‐XX:+UseGCLogFileRotation
‐XX:NumberOfGCLogFiles=10
‐XX:GCLogFileSize=100M
修改项目启动脚本:
java -Xms128m -Xmx1024m -XX:+PrintGCDateStamps -XX:+PrintGCDetails ‐XX:+PrintGCCause -Xloggc:./logs/gclogs -jar ***.jar --server.port=8082 > /dev/null 2>&1 &
由于减少了内存, 上面的系统崩溃不一定会出现, 但是假死应该还会出现, 等待分析Gc 输出。
日志输出异常:
2022-05-31T10:27:13.191+0800: 12.162: [Full GC (Metadata GC Threshold) ……………………[Times: user=7.16 sys=0.04, real=0.30 secs] #user 耗费高 , 实际清理只有0.3 。 用户线程等待耗时。
加入打印JVM暂停的时间, 安全点日志。
启动参数
-XX:+UnlockDiagnosticVMOptions
-XX:+LogVMOutput
-XX:LogFile=/dev/shm/vm.log
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
java -Xms128m -Xmx1024m -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./logs/gclogs -jar ***.jar --server.port=8082 > /dev/null 2>&1 &
java -Xms128m -Xmx1024m -XX:+SafepointTimeout -XX:SafepointTimeoutDelay=5000 -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./logs/gclogs -jar ***.jar --server.port=8082 > /dev/null 2>&1 &
#-XX:+UnlockDiagnosticVMOptions
#-XX:+LogVMOutput
#-XX:LogFile=/dev/shm/vm.log