本文介绍了在Linux系统中遇到CPU使用率过高的问题时,如何通过`top`、`ps`、`printf`和`jstack`等命令进行定位和分析。通过两种方法详细阐述了如何查找异常进程和线程,以及如何使用`jstack`工具获取线程堆栈信息,以确定导致CPU高的原因。同时,讲解了用户态和内核态的概念以及它们之间的切换过程。 摘要由CSDN通过智能技术生成

1. 使用top命令定位异常进程。

使用top命令定位异常进程。可以看见12836的CPU和内存占用率都非常高
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6IYSclu-1592923229833)(E:\文档\学习资料\笔记\面经\Linux下的问题.assets\20160503111524410.png)]

此时可以再执行ps -ef | grep java,查看所有的java进程,在结果中找到进程号为12836的进程,即可查看是哪个应用占用的该进程。

2. 使用top -H -p 进程号查看异常线程

3. 使用printf “%x\n” 线程号将异常线程号转化为16进制

或者是echo ‘obase=16;12875’ | bc

bc是linux的计算器命令

4. 使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置

使用jstack 进程号|grep 16进制异常线程号 -A90来定位异常代码的位置(最后的-A90是日志行数,也可以输出为文本文件或 、使用其他数字)。可以看到异常代码的位置。

jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。 Jstack工具可以用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。

1.使用top指令,然后按shift + p按照CPU排序

找到占用CPU过高的进程

2. 使用ps -mp pid -o THREAD,tid,time | sort -rn

获取线程信息,并找到占用CPU过高的线程

3. 使用echo ‘obase=16;[线程id]’ | bc或者printf “%x\n” [线程id]

将需要的线程ID转换成16进制格式

在日常工作中,我们有时候需要排查线上 问题 ,找出系统中CPU利用率最高的 线程 .当然,我们这里默认被排查的 线程 在JVM中,而不是其他非JVM的 线程 .涉及的命令$ top $ jstack思路1.根据top和ps命令查找到进程中CPU利用率最高的 线程 (内核级 线程 ) 2.将内核级 线程 的十进制转成十六进制 3.根据jstack命令获取JVM级的 线程 信息方式一1.通过top命令找到CPU消耗(%CP...
2.找出该进程内最耗费CPU的 线程 top -Hp 2444 linux 下,所有的java内部 线程 ,其实都对应了一个进程 id ,也就是说, linux 上的sun jvm将java程序中的 线程 映射为了操作系统进程 3.将 线程 ID 转化为 16进制 printf “%x\n” ... 1.1.什么是top?什么是jstack? 1.1.1. top:top命令经常用来监控 Linux 的系统状况,比如cpu、内存的使用。 如下图所示:简单的使用top命令打出以下信息 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Dfw8pQU-1612256298436)(https://cdn.nlark.com/yuque/0/2019/png/435623/1569821900020-f243790e- 描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储 局部变量、操作数栈、动态链接、方法出口等信息.生命周期与 线程 相同。栈里面存放着各种基本数据类型和对象的引用 本地方法栈: 本地方法栈则为虚拟机使用到的Native方法服务(非java代码的接口,比如C++的方法:Runti 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现。 重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行。 1、然后从任务管理器直接...