背景:
某台服务器上同时部署应用程序、redis。资源:4c8g,内存使用率连续半个月90%以上,为预防故障发生进行排查。
(一篇不错的jvm调优博文:https://mp.weixin.qq.com/s/Od9qjM0lMUHi5jUWZmS4Iw)
方案:
一、查看占用内存的情况
1.获取服务信息
top 按m
2.分析信息
5188进程,VIRT(虚拟内存)使用16.2g,RES占用6.9g,%MEM(内存占用率)89.4%
2178进程为redis进程占用18m
3.结果
可以看出占用资源较大的为java进程
进一步分析可使用以下命令,查看占用内存资源的情况。
/opt/jdk/bin/jmap -histo [进程号]
/opt/jdk/bin/jmap -histo [进程号]
/opt/jdk/bin/jstat -gcutil [进程号]
jmap命令相关博文:https://www.cnblogs.com/qq78292959/p/5141209.html
二、查看redis内存使用情况
1.获取服务信息
进入redis安装目录,进入src或bin目录下,执行以下命令:
./redis-cli -p 6379
输入命令auth 密码,显示ok后,输入info
示例:
2.分析信息
# Memory
used_memory:13490096 //数据占用了多少内存(字节 byte)
used_memory_human:12.87M //数据占用了多少内存(带单位的,可读性好)
used_memory_rss:13490096 //redis占用了多少内存
used_memory_peak:15301192 //占用内存的峰值(字节)
used_memory_peak_human:14.59M //占用内存的峰值(带单位的,可读性好)
used_memory_lua:31744 //lua引擎所占用的内存大小(字节)
mem_fragmentation_ratio:1.00 //内存碎片率
mem_allocator:libc //redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。
3.结果
占用内存11m(与top结果一致),不大排除redis数据占用内存过大
三、查看tomcat配置jvm参数
1.获取信息,查看tomcat的bin目录下的catalina.sh
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-Xms3072m -Xmx10240m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=1024m"
cygwin=false
darwin=false
os400=false
hpux=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
HP-UX*) hpux=true;;
esac
2.分析信息
-Xmx3g -Xms3g,将JVM最大内存与初始内存设置相等,避免JVM垃圾回收后重新分配内存;
jvm调优的相关博文:https://blog.csdn.net/weixin_41987553/article/details/82670914 https://www.cnblogs.com/likehua/p/3369823.html
3.结果
服务器资源为8g,设置的Xmx为10g过大,需要调小此参数或进行内存扩容