现象:前段时间发现某台开发机上各个微服务进程占用内存很高,经常出现某个服务挂掉的现象,这里记录下解决思路方案,仅供参考。
查看发现服务器剩余内存很小
free -m

这是台测试服务器,内存本来就小,但是运行的服务挺多,包括一个微服务和springboot项目,本身微服务就很占内存,几个微服务项目的服务直接就把服务器内存占光了,所有新增了springboot项目后经常出现某个服务挂掉的现象。
所以想着看看能不能较少某个服务的分配内存来增加项目存活的可能性。
解决问题之前,先复习下几个基础知识。
1、什么是RES?top命令经常看到的
RES:resident memory usage 常驻内存
(1)进程当前使用的内存大小,但不包括swap out
(2)包含其他进程的共享
(3)如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
(4)关于库占用内存的情况,它只统计加载的库文件所占内存大小
RES = CODE + DATA
2、JVM内存模型
非heap(非heap=元空间+栈内存+…)+heap+JVM进程运行所需内存+其他数据
因为测试环境,使用的人员比较少,并且出现问题是在新增了其他的项目都出现的,所有排除了代码的问题。(也有可能是jvm内存泄漏引起的,大家有这个问题的话可以去用Jmap命令将整个heap dump下来,然后用jvisualvm分析)
这里用到的命令:
jmap -heap [pid]
//关于内存占用比例的一个命令
ps aux | sort -k4nr | head -n 10
- 注意:如果服务器中有多个jdk,请到具体的jdk/bin下执行jmap命令,
/usr/local/jdk1.8.0_74/bin/jmap -heap 28177
图1中jvm占用内存计算:
元空间(5MB)+ eden(118MB)+年老代(187MB)+线程栈(49*1024KB)+JVM进程本身运行内存+ NIO的DirectBuffer +JIT+JNI+…≈top(Res) 470MB
当前jvm线程数统计:jstack 7311 |grep ‘tid’|wc –l
(linux 64位系统中jvm线程默认栈大小为1MB)
所以去修改启动脚本,修改项目服务的JVM大小;部署系统的启动脚本,正确的Java命令:
java [ options ] class [ arguments ]
java [ options ] -jar file.jar [ arguments ]
- 注意:linux执行命令的时候要注意空格的使用,千万不能多打
网友评论