CPU过载、内存溢出问题一般出现在线上项目中,因为开发环境用户量和数据量都很小,即使你的代码有问题也不会爆发出来。线上出现这样的问题是比较严重的,需要认真对待,妥善解决。
问题原因
造成这样问题有两个大类型的原因:
一,性能问题,高并发高访问情况下线程太多,内存不够用;这个时候体现了多线程的一个危害,cpu过载而且可能内存溢出
二,代码问题,如代码中有死循环、一次查询数据量太大、存在太多对象引用内存无法回收(如集合里有大对象没有回收),数据库死锁等。
使用top, free, uptime等命令查看CPU、内存使用情况。 cpu、内存使用率阶段性较高时,是由于某段时间并发量比较高,导致服务器性能出现瓶颈,那么说明你可能需要升级服务器或者横向添加服务器做集群负载了。 当CPU、内存使用长时间居高不下,那么很可能是代码出现了问题。需要进一步排查了。
jstack排查cpu使用问题
步骤:
1.top命令找出最高占用的进程(command为java)该命令具体详细介绍看linux load命令
2.查看高负载进程下的高负载线程:top -Hp 【PID】 (或 ps -mp PID -o THREAD,tid,time)
3.找出最高占用的线程并记录thread_id,把线程号 进行换算成16进制编号:printf ‘0x%x’ thread_id
这里假设存在高占用线程,得到占用cpu最高的线程是:19209
把线程号 19209 进行换算成16进制编号:0x4b09