线上服务器负载很高,于是常规操作;
1.top 获取占用cpu最高进程PID
通过top -c
(然后按Shift+M
按内存排序),或者htop
等工具定位到具体的高内存进程。
2.top -H -p 17532 获取该进程占用最高的线程TID,(然后按Shift+M
按内存排序)定位占内存的线程:
并且查看是线程过多还是某些线程占用太大,适用于查看内存占用高;
3.打印堆栈日志:
转换16进制
printf "%x\n" 17539
jstack 17532|grep 4483 -A 10 > 4483.log
5.查看gc情况:
jstat -gcutil 17532 5000
6.发现频繁fullgc,查询具体情况;
发现大量关于DruidDataSource数据库连接池的线程,其中JdbcDataSourceStat中持有大量HashMap对象,分析得出是开启了druid监控导致的存储的大量sql语句释放不掉导致的频繁fullgc,于是关闭监控功能;
将log4j切换到logback后观察,并且将druid更换为了HikariCP,并调整参数;之前项目的开发者设置的最大连接池连接数高达8000....
上线后观察,不是高峰期的时候,cpu占用直接从二十多到个位数;只负载部署一台观察;
其他(查找内存占用大原因):
1.dump内存快照:
2.使用MAT工具分析或者线上使用jstat分析:
分析完成后,访问端口号7000可查看;
3.还可以使用阿里Arthas分析
本文由 GY 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2021/11/19 15:47