CPU100%解决思路

本文详细介绍了如何通过top-c监控进程状态,使用jmap分析Java进程内存使用情况,以及arthas工具进行线程追踪和堆栈调试。还涉及了十六进制转换、jps查看进程、jinfo获取进程详细信息和堆栈跟踪技术的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

top -c 查进程

 PID                                               CPU  MEN                           
2305124 root      20   0 5788000   2.1g  11140 S   1.0  29.0   1304:05 java -jar /home/data/mnt/data-sharing-mq/data-sharing-0.0.1-SNAPSHOT.jar

top -Hp 2305124 根据进程号查旗下线程

 PID                                               CPU  MEN
2732246 root      20   0 5788000   2.1g  11140 S  59.8  29.5   0:08.39 org.springframe                                                                           
2732289 root      20   0 5788000   2.1g  11140 S  14.6  29.5   0:00.44 thd1                                                                                      
2305133 root      20   0 5788000   2.1g  11140 R   8.6  29.5  87:50.20 java                                                                                      
2305130 root      20   0 5788000   2.1g  11140 R   8.3  29.5  87:49.55 java

把线程号转成十六进制

printf %x 2732246
    29b0d6
printf %x 2732289
    29b101
printf %x 2305133
    232c6d
printf %x 2305130
    232c6a

jstack -l 2305124 > ./2305124.stack

jstack -l 进程号,查看进程内所有的堆栈调用情况
根据进程号2305124查出对应的java线程,进行处理
jstack Java自带的堆栈追踪,> ./filename并将堆栈追踪信息输出到当前目录的2305124.stack文件中

cat 2305124.stack | grep ‘29b0d6’ -C 20 执行grep命令,看线程29b0d6做了什么。

jps

Java process查看正在运行的Java进程

jps
2276820 Jps
3527724 jar
399 data-sharing-0.0.1-SNAPSHOT.jar

jinfo 进程号

查看某个Java进程的详细信息

CPU100%解决思路

jmap查找Java进程2305124中各对象占用情况

jmap -histo 2305124 | head -20
执行结果:
 num     #instances         #bytes  class name
----------------------------------------------
   1:      12812723      332995040  [B
   2:       6691281      191802240  [C
   3:       6350453      152410872  java.lang.String
   4:       1700071      122405112  com.sxqx.entity.sync.StationPreHistory
jmap 是 JDK 自带的一个工具,可以生成 Java 进程的内存转储快照(heap dump),也可以查看 Java 进程的内存使用情况。
-histo 参数是 jmap 命令的一个选项,表示输出 Java 堆中各类对象的数量、大小和类名等信息。
2305124是指要查看内存使用情况的Java进程的进程ID2305124可以根据top -c找到占用内存最多的Java进程ID。
head -20 表示只显示前 20 行的分析结果,从而使输出结果更加简洁。
因此,运行这个命令将会输出进程 ID2305124Java 程序的内存使用情况的前 20 行分析结果,包括各类对象的数量、大小和类名。请注意,这个命令需要在控制台中执行。

jmap -dump:format=b,file=20240319.hprof 626270

jmap也可以导出堆内存,并且使用jdk自带的工具<java_home>\bin\jvisualvm.exe来解析

jstat –gc

显示gc相关的堆信息,查看gc的次数,及时间
jstat –gc <pid>

安装arthas

Linux下安装Arthas

arthas命令

1,help
help命令查看全部命令
2,启动
进入arthas安装目录,执行命令:java -jar arthas-boot.jar
3,退出绑定进程
如果启动arthas显示例如Process 4547 already using port 3658
stop命令解除绑定

4,thread如下

5,jvm
显示jvm信息包含了垃圾回收器
6,jad 全路径名.类名 Java Decompiler在线反编辑
比如:jad com.meteorological.service.prehistory.impl.PreHistoryService

7,trace如下

4,thread命令

4,thread
thread	显示所有的线程
ID     NAME                                    GROUP                PRIORITY     STATE         %CPU         DELTA_TIME    TIME         INTERRUPTED   DAEMON       
28     http-nio-1900-Poller                    main                 5            RUNNABLE      0.02         0.000         0:18.069     false         true         
2      Reference Handler                       system               10           WAITING       0.0          0.000         0:0.161      false         true                
1153   Java2D Disposer                         system               10           WAITING       0.0          0.000         0:0.000      false         true

thread 28	显示28号线程调用栈
"http-nio-1900-Poller" Id=28 RUNNABLE (in native)
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:799)
    at java.lang.Thread.run(Thread.java:748)
              
thread -b显示所有的死锁

7,trace 链路追踪,追踪调用链耗时

1,trace命令开始链路追踪之后,触发该接口
2,执行结果中packageName.className:方法名() #57表示该方法所在行号 +---[99.33%时间占比 317.751886ms ]
3,--skipJDKMethod false参数:表示跳过jdk自带方法

1>命令:
trace --skipJDKMethod false  trace --skipJDKMethod false com.meteorological.service.cmadaas.radar.impl.RadarService getRadarFileByTimeRange
2>触发命令后:
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 136 ms, listenerId: 3
3>触发接口后:
`---ts=2024-03-11 17:58:01;thread_name=http-nio-1900-exec-5;id=22;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3a52dba3
    `---[53.088744ms] com.meteorological.service.cmadaas.radar.impl.RadarService:getRadarFileByTimeRange()
        +---[0.03% 0.01455ms ] com.meteorological.pojo.cmadaas.reqparams1.RadarParams:<init>() #18
        com.meteorological.pojo.cmadaas.reqparams1.RadarParams:setDataFormat() #29
        +---[0.02% 0.01054ms ] java.lang.System:currentTimeMillis() #30
        +---[0.04% 0.019002ms ] java.lang.String:valueOf() #30
        +---[0.03% 0.013766ms ] com.meteorological.pojo.cmadaas.reqparams1.RadarParams:setTimestamp() #30
        +---[0.14% 0.076705ms ] java.util.UUID:randomUUID() #31
        +---[0.02% 0.010492ms ] java.util.UUID:toString() #31
        +---[0.01% 0.006414ms ] com.meteorological.pojo.cmadaas.reqparams1.RadarParams:setNonce() #31
        +---[0.07% 0.03484ms ] com.meteorological.utils.common.JavaBeanUtils:BeanPropertyNameTraverse() #32
        +---[0.03% 0.015445ms ] java.util.HashMap:put() #34
        +---[0.38% 0.203014ms ] com.meteorological.utils.tianqing.SignGenUtil:getSign() #35
        +---[0.02% 0.010761ms ] java.util.HashMap:remove() #36
        +---[0.01% 0.007098ms ] java.util.HashMap:put() #37
        `---[98.36% 52.217813ms ] com.meteorological.utils.request.HttpClientUtils:doGet() #40

arthas 常用命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值