cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%;我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束。
产生CPU100%的原因:
某一程序一直占用CPU是导致CPU100%的原因,大概有以下几种情况:
1、Java 内存不够或溢出导致GC overhead问题, GC overhead 导致的CPU 100%问题;2、死循环问题. 如常见的HashMap被多个线程并发使用导致的死循环, 或者死循环;3、某些操作一直占用CPU
第一步:使用top命令,查看占用cpu的进程
[root@sdfsdfseZ codeimage]# top
![195584d956d94b695d38bf46ef5ab37f.png](https://i-blog.csdnimg.cn/blog_migrate/da3ac3d1e9dbc81bcebd247e15f2228f.jpeg)
第二步:ps -ef | grep java 或jps命令,找出服务器的所有java进程
![d9689935659407b8d50840a21be666c0.png](https://i-blog.csdnimg.cn/blog_migrate/23ba126a1415b1f70a9d6b3d7b6228ff.jpeg)
第三步:找出CPU耗用最厉害的进程pid
![b821cb38c75925255aa8fe3e4f9bd671.png](https://i-blog.csdnimg.cn/blog_migrate/30bd47fba099a946609585f773bd5721.jpeg)
第四步:查找出具体占用cpu利用率最厉害的线程号,top -H -p pid 。然后按下shift+p,跳出CPU监控
当前线程号为:1747
![80b058c79f4b7e3711e36197286164cf.png](https://i-blog.csdnimg.cn/blog_migrate/bef6d54206f5b755fdbaac5c8ef6d0cb.jpeg)
第五步:将获取到的线程号转换成16进制
因为java线程栈文件中的线程id是十六进制,需要将线程id从十进制转为十六进制。十进制 转十六进制的命令如下:
结果为:
![9e3a974302d9ecbd5050acdcf9ed95a2.png](https://i-blog.csdnimg.cn/blog_migrate/f9305a09eccb73edcd9a573d3dc05583.jpeg)
第六步:导出线程栈
将具体的占用CPU过高的java进程的线程栈导出,导出命令如下:
pid.tdump文件后缀名随意,通常以tdump结尾。
[root@sdfsdfsdeZ codeimage]# jstack 1747 > tmp/1747.tdump
![87e507ed8c44a6e719249602cea48524.png](https://i-blog.csdnimg.cn/blog_migrate/35efedb0ad6020de50439e52d7a1322b.jpeg)
可能会抛出异常;
1747: Unable to open socket file: target process not responding or HotSpot VM not loadedThe -F option can be used when the target process is not responding
原因分析
jvm运行时会生成一个目录hsperfdata_$USER($USER是启动java进程的用户),在linux中默认是/tmp,目录下会有些pid文件,存放jvm进程信息,而jmap,jstack等工具会读取/tmp/hsperfdata_$USER下的pid文件获取连接信息.
检查了/tmp/hsperfdata_root目,,但在$TOMCAT_HOME目录中的temp目录中有对应的文件.
解决办法
到
或使用
[root@iZ2zeab8t820b5ywp0rkfeZ bin]# jstack 1706 > /tmp/hsperfdata_root/1706.tdump
第七步:导出堆
[root@sddsdfsaZ bin]# jstat -gcutil 1706
![b8c908d5e9a868751b5787625477dc69.png](https://i-blog.csdnimg.cn/blog_migrate/cf69594ae0ef88055afa34f5ae941d20.jpeg)
第八步:jvisualvm分析快照
使用JAVA_HOME/bin/jvisualvm.exe,载入快照
文件----->载入—>文件类型(Dump)
![5d41ec476f5dbc4e271e097d8606b9c6.png](https://i-blog.csdnimg.cn/blog_migrate/4564528ddae6e971933f478e80e3e976.jpeg)
![066c5b8996df2181661b56d19bd24648.png](https://i-blog.csdnimg.cn/blog_migrate/cb8b69e7b70bdcca63bf8e052efb46dd.jpeg)