假如生产环境出现cpu占用过高,请谈谈你的分析思路和定位
1. 先用top命令找出cpu占比最高的
top
2. ps -ef或者jps进一步定位,得知是怎样一个后台程序
a. ps -ef命令
ps -ef|grep 3928|grep -v grep
b. jps命令
jps -l #显示所有的java程序的进程和信息
3. 定位到具体线程
ps -mp 进程 -o thread,tid,time
参数解释:
-m 显示所有的线程
-p pid进程使用cpu的时间
-o 该参数是用户自定义格式
ps -mp 3928 -o thread,tid,time
4. 将需要的线程id转换成16进制格式(英文小写格式)
printf "%x\n" 有问题的线程id
printf "%x\n" 3929
5. jstack 进程id | grep tid(16进制线程id小写英文) -A60
-A60的意思是显示前60行
该命令会打印出线程栈的日志,根据日志就能定位到具体的代码行数和问题
jstack 3928 | grep 13ee -A60
相关阅读:
对于jdk自带的jvm监控和性能分析工具用过哪些?一般你是怎么用的?
阿里巴巴java开发手册中使用线程池不当导致内存溢出的情况
【强制】 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这
样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下:
1) FixedThreadPool 和 SingleThreadPool:
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
2) CachedThreadPool:
允许的创建线程数量为 Integer.MAX_VALUE, 可能会创建大量的线程,从而导致 OOM。
网友评论