一、top+jstack命令
top查看当前系统运行的情况,cpu占用率,内存使用率等等
[root@centos20 ~]# top #查看进程
top - 14:42:39 up 46 days, 21:19, 7 users, load average: 0.00, 0.04, 0.10
Tasks: 645 total, 1 running, 644 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 13184587+total, 12338808 free, 36164808 used, 83342256 buff/cache
KiB Swap: 8257532 total, 8190196 free, 67336 used. 94830576 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2486 mysql_r+ 20 0 4092536 1.9g 18888 S 0.7 1.5 655:20.34 mysqld
3424 root 20 0 645024 26320 9336 S 0.7 0.0 166:23.73 gsd-color
68005 root 20 0 162664 2852 1600 S 0.7 0.0 16:53.86 top
3509 root 20 0 566808 25636 18832 S 0.3 0.0 45:40.79 vmtoolsd
21542 root 20 0 54.9g 14.6g 23324 S 0.3 11.6 179:32.58 java
37260 root 20 0 162660 2880 1584 R 0.3 0.0 0:13.40 top
............
[root@centos20 ~]# top -Hp 21542 #查看cpu占用率高的进程的线程信息
top - 14:45:38 up 46 days, 21:22, 7 users, load average: 0.16, 0.15, 0.14
Threads: 332 total, 0 running, 332 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 13184587+total, 12538272 free, 35962944 used, 83344656 buff/cache
KiB Swap: 8257532 total, 8190196 free, 67336 used. 95032904 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21613 root 20 0 54.9g 14.6g 23324 S 0.3 11.6 5:19.99 java
21765 root 20 0 54.9g 14.6g 23324 S 0.3 11.6 0:28.48 java
21542 root 20 0 54.9g 14.6g 23324 S 0.0 11.6 0:00.00 java
.............
二、使用JMC可视化工具
三、可能导致CPU占用率过高的场景与解决方案-1
1.无限while循环
尽量取消无限循环的场景
必要无限循环的情况,让循环执行的速度放慢
2.频繁GC
意味着垃圾收集线程频繁执行,CPU升高,解决方案:降低GC频率
3.频繁创建对象
合理使用单例,频繁创建对象,浪费内存,还导致cpu过高
4.序列化和反序列化
选择合理的API实现功能
5.正则表达式
使用的引擎在进行字符串匹配时会发生回溯,会产生cpu过高
6.频繁的线程上下文切换
降低切换的频率(结合业务和代码进行代码改造)