⑴ 通过top和jstack确定哪些线程耗尽了CPU这些线程在做什么
打开终端,使用jstack命令输出这一时刻的线程栈,保存到文件,命名为jstack.log。
注意:输出线程栈和保存top命令快照尽量同时进行。
英特尔最新推出了第六代酷睿产品,采用全新一代的架构,性能提示、功能降低、续航更加长久、无论办公学习、畅玩游戏或者观看超高清音箱播放,均得心应手,您也可以试试。
⑵ 通过top和jstack确定哪些线程耗尽了CPU这些线程在做什么
背景有时,线上集群load会突然飙升,无法响应正常请求。那么引起load飙升的线程专究竟在做什属么?哪些线程霸占了CPU?可以通过top和jstack命令进行定位。2. 定位步骤1. 使用终端1进入目标机器,执行top命令,默认是进程视图,其中PID是进程号,截图如下:在这里,我们只能看到java进程占用CPU达到115%,那么究竟是那些线程非常耗CPU呢?2. 由于我们要看到线程,在终端1,按下“H”键或者“shift+h”,top视图会切换到线程视图,其中PID是线程号,截图如下:可以发现红框内的线程的CPU使用率非常高,占用CPU时间达到1秒左右,显然不正常,但是这些线程在做什么?3. 打开终端2,使用jstack命令输出这一时刻的线程栈,保存到文件,命名为jstack.log。注意:输出线程栈和保存top命令快照尽量同时进行通过top和jstack确定哪些线程耗尽了CPU?这些线程在做什么
⑶ 如何查看unix 的java内存使用情况
jmap (linux下特有,也是很常用的一个命令)
观察运行中的jvm物理内存的占用情况。
参数如下:
-heap :打印jvm heap的情况
-histo: 打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live : 同上,但是只答应存活对象的情况
-permstat: 打印permanent generation heap情况
命令使用:
jmap -heap 3409
可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
输出内容:
jmap -histo 3409 | jmap -histo:live 3409
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
输出内容:
写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。
如果结果很多,可以用以下命令输出到文本文件。
jmap -histo 3409 | jmap -histo:live 3409 > a.txt
jinfo:可以输出并修改运行时的java 进程的opts。
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
详细:在使用这些工具前,先用JPS命令获取当前的每个JVM进程号,然后选择要查看的JVM。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。
jmap是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
命令:jmap -mp:format=b,file=heap.bin
file:保存路径及文件名
pid:进程编号
?jmap -histo:live pid| less :堆中活动的对象以及大小
?jmap -heap pid : 查看堆的使用状况信息
jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。
jconsole是一个用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。使用方法:命令行里打 jconsole,选则进程就可以了。
JConsole中关于内存分区的说明。
Eden Space (heap): 内存最初从这个线程池分配给大部分对象。
Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。
Permanent Generation (non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)
?jstack ( 查看jvm线程运行状态,是否有死锁现象等等信息) : jstack pid : thread mp
?jstat -gcutil pid 1000 100 : 1000ms统计一次gc情况统计100次;
另外推荐一款查看jmap mp 的内存对象工具 MemoryAnalyzer
⑷ 重点问题!CPU利用率过高排查思路|原创
面对CPU利用率过高的问题,排查与解决步骤如下:
首先,当线上服务遭遇CPU利用率异常增高,首要目标应是尽快恢复服务的可用性,减少对业务的影响。
通常,我们通过监控系统收到服务器负载异常的告警,其中CPU使用率过高是常见问题。可能的原因包括业务代码死循环、垃圾回收(GC)频繁或线程阻塞等。
在测试环境模拟CPU利用率过高的情况时,可以使用以下步骤以创建死循环示例:
1.创建并编辑名为Test.java的文件。
输入如下代码并保存:
代码示例
通过命令行编译生成Test.class文件,然后执行测试文件,即可模拟CPU利用率过高的场景。
排查步骤包括:
1.使用top命令查看占用CPU最多的Java进程。
2.根据进程ID(PID)找到对应CPU占用最高的Java进程。
3.将10进制的线程ID转换为16进制。
4.使用jstack命令获取对应问题现场的堆栈信息。
通过上述步骤,可以发现问题线程处于runnable状态,并定位到问题代码所在位置,如Test.java:7,发现死循环。
针对不同情况,解决方法各异:
1.当业务线程出现大量阻塞,如synchronized锁,通过查找状态为BLOCKED的线程并分析堆栈信息。
2.排查网络IO或磁盘IO阻塞问题时,同样应用上述方法分析。
3.对于频繁的GC线程导致的高CPU利用率,线程标识为GC task thread。这需要专门分析,可能涉及年轻代设置不合理、大对象分配过多或old区存活对象过多等问题。