[[TOC]]

通过分析 ThreadDump 来查询Java程序运行情况

获取线程转储文件

有多种方式可以获取转储文件,可参考链接HOW TO TAKE THREAD DUMPS? – 8 OPTIONS

下面介绍 jps+jstack的方式获取 ThreadDumps

步骤1:查看当前虚拟机所有进程

jps -l 

output如下:

46832 com.chinamobile.epic.MgmtApplication
16900 org.jetbrains.idea.maven.server.RemoteMavenServer
38980 sun.tools.jps.Jps
43828 org.jetbrains.jps.cmdline.Launcher
9544 

其中 ++46832 com.chinamobile.epic.MgmtApplication++ 为将要分析的程序程序;

步骤2:使用jstack获取转储文件

指令:

jstack -l  <pid> > <file-path>

example: 得到转储文件 threaddump-46832.txt

jstack -l 46832 > threaddump-46832.txt

在k8s中获取srv的 threaddump

1. 获取服务名

kubectl get pod | grep mgmt

output:
epic-mgmt-254096307-np82s                    1/1       Running            0          46m

2. 进入服务

kubectl exec -it epic-mgmt-254096307-np82s /bin/sh

3. jps -l 获取进程ID

# jps -l
1 /epic-mgmt.jar     # pid=1
1036 sun.tools.jps.Jps

4.获取 Threaddump

// 导出到 Threaddump010.txt
jstack -l 1 > /var/lib/docs/mgmt/epic-mgmt-threaddump010.txt

之所以导出到那个目录,因为 如下配置文件:(完成k8s的目录到 linux目录的映射)

...省略...
 containers:
      - image: 10.254.9.21/library/epic-mgmt:0.1.16
        name: epic-mgmt
        volumeMounts:
        - mountPath: "/var/lib/docs"
          name: epic-docs
        - mountPath: "/var/log/epic"
          name: epic-logs
        ports:
        - containerPort: 8028
          name: mgmt
      volumes:
      - name: epic-docs
        hostPath:
          path: "/opt/data/docs"
      - name: epic-logs
        hostPath:
          path: "/opt/data/logs"
...省略...

分析 ThreadDump

使用在线工具:
http://fastthread.io
【Java】线程转储分析 ThreadDump

分析结果示例:

【Java】线程转储分析 ThreadDump
【Java】线程转储分析 ThreadDump
【Java】线程转储分析 ThreadDump
【Java】线程转储分析 ThreadDump
【Java】线程转储分析 ThreadDump

相关文章:

  • 2021-10-29
  • 2022-12-23
  • 2021-11-05
  • 2022-12-23
  • 2021-07-09
  • 2022-12-23
  • 2021-07-07
  • 2022-12-23
猜你喜欢
  • 2021-08-01
  • 2021-09-03
  • 2021-05-12
  • 2021-08-17
  • 2021-05-11
  • 2021-10-08
相关资源
相似解决方案