springboot微服务自动挂了问题定位过程
测试服务器(32G内存)环境的springboot微服务莫名其妙的挂掉,记录分析过程:一、top检查cpu是否负载,%Cpu那行的id,值越高cpu越空闲二、top检查占用高内存程序,top按M从大到小查看占用高内存的程序,发现有几个java应用占了20%左右,再用ps -aux|grep pid查看这几个java服务每个占用了8G左右内存三、jmap -heap pid查看分配的jvm内存参数,
测试服务器(32G内存)环境的springboot微服务莫名其妙的挂掉,记录分析过程:
一、检查是否因为内存满了导致系统自动kill掉了服务
linux执行 dmesg 命令查看内核日志,如图表示内存满了导致系统自动kill掉了服务。
一、top检查cpu是否负载,%Cpu那行的id,值越高cpu越空闲
二、top检查占用高内存程序,top按M从大到小查看占用高内存的程序,发现有几个java应用占了20%左右,再用ps -aux|grep pid查看这几个java服务每个占用了8G左右内存
三、jmap -heap pid查看分配的jvm内存参数,相关参数的名称意思(网上找的说明)如下,发现自己查看的MaxHeapSize参数占用了8G+内存
jmap -heap pid
using thread-local
object allocation.
Parallel GC with 4 thread(s) #GC 方式
Heap Configuration: #堆内存初始化配置
MinHeapFreeRatio=40 #对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio=70 #对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize=512.0MB #对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1.0MB #对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize =4095MB #对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 4.0MB #对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 8 #对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 #对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize= 16.0MB #对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
MaxPermSize=64.0MB #对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
Heap Usage: #堆内存分步
PS Young Generation
Eden Space: #Eden区内存分布
capacity = 20381696 (19.4375MB) #Eden区总容量
used = 20370032 (19.426376342773438MB) #Eden区已使用
free
= 11664 (0.0111236572265625MB) #Eden区剩余容量
99.94277218147106% used #Eden区使用比率
From Space: #其中一个Survivor区的内存分布
capacity = 8519680 (8.125MB)
used = 32768 (0.03125MB)
free
= 8486912 (8.09375MB)
0.38461538461538464% used
To Space: #另一个Survivor区的内存分布
capacity = 9306112 (8.875MB)
used = 0 (0.0MB)
free
= 9306112 (8.875MB)
0.0% used
PS Old Generation #当前的Old区内存分布
capacity = 366280704 (349.3125MB)
used = 322179848 (307.25464630126953MB)
free
= 44100856 (42.05785369873047MB)
87.95982001825573% used
PS Perm Generation #当前的 “永生代” 内存分布
capacity = 32243712 (30.75MB)
used = 28918584 (27.57891082763672MB)
free
= 3325128 (3.1710891723632812MB)
89.68751488662348% used
四、检查了这几个springboot微服务的启动命令是有加InitialHeapSize和MaxHeapSize参数的,而且也就设置500M,可修改了几次jmap -heap pid看MaxHeapSize参数还是占用了8G+内存,大概发现结论是-Xmx1g -Xms1g参数不生效
java -jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/test/ test.jar -Xmx1g -Xms1g --app.id=aerasfsa
五、经网上查资料,jvm参数设置需放在jar包命令前面,application.properties里面的参数 --app.id=aerasfsa放在jar后面,修改启动命令如下
java -jar -Xmx1g -Xms1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/test/ test.jar --app.id=aerasfsa
六、再次检查jmap -heap pid查看分配的jvm内存参数,正确,与配置一样,linux内存得到释放,问题解决
更多推荐
所有评论(0)