加载中...

java 日常故障排查


1.1 Java 常用工具介绍

这些命令在 JDK 安装目录下的 bin 目录下:

  • jps (JVM Process Status): 类似 UNIX 的 ps 命令。用户查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;
  • jstat( JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;
  • jinfo (Configuration Info for Java) : Configuration Info forJava,显示虚拟机配置信息;
  • jmap (Memory Map for Java) :生成堆转储快照;
  • jhat (JVM Heap Dump Browser ) : 用于分析 heapdump 文件,它会建立一个 HTTP/HTML 服务器,让用户可以在浏览器上查看分析结果;
  • jstack (Stack Trace for Java):生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合。

Jps 查看所有 Java 进程

jps类似Linux中的ps 可以显示当前运行的java服务的pid

jps
1 test.jar
10837 Jps

jps -l输出主类的全名,如果进程执行的是 Jar 包,输出 Jar 路径

jps -l
1 test.jar
8693 jdk.jcmd/sun.tools.jps.Jps

jps -v输出虚拟机进程启动时 JVM 参数。

jps -v
1 test.jar -javaagent:/usr/local/skywalking/agent/skywalking-agent.jar
8715 Jps -Denv.class.path=.:/usr/local/openjdk-11/lib:/lib -Dapplication.home=/usr/lib/jvm/java-11-openjdk-amd64 -Xms8m -Djdk.module.main=jdk.jcmd

jstat 监视虚拟机各种运行状态信息

jstat(JVM Statistics Monitoring Tool) 使用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程(需要远程主机提供 RMI 支持)虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。

jstat 命令使用格式:

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

比如 jstat -gc -h3 31736 1000 10表示分析进程 id 为 31736 的 gc 情况,每隔 1000ms 打印一次记录,打印 10 次停止,每 3 行后打印指标头部。

jstat -gc -h3 1 1000 10
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT   
25088.0 25088.0  0.0   8996.0 201024.0 91785.3   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977
25088.0 25088.0  0.0   8996.0 201024.0 91801.5   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977
25088.0 25088.0  0.0   8996.0 201024.0 92093.9   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT   
25088.0 25088.0  0.0   8996.0 201024.0 92321.7   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977
25088.0 25088.0  0.0   8996.0 201024.0 92339.7   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977
25088.0 25088.0  0.0   8996.0 201024.0 92343.5   501624.0   393269.6  195240.0 185525.6 26240.0 22619.2    491   15.240   6      2.737   -          -   17.977

jinfo 实时地查看和调整虚拟机各项参数

jinfo vmid :输出当前 jvm 进程的全部参数和系统属性 (第一部分是系统的属性,第二部分是 JVM 的参数)。

jinfo -flag name vmid :输出对应名称的参数的具体值。比如输出 MaxHeapSize、查看当前 jvm 进程是否开启打印 GC 日志 ( -XX:PrintGCDetails :详细 GC 日志模式,这两个都是默认关闭的)。

jinfo  -flag MaxHeapSize 1
-XX:MaxHeapSize=8329887744
jinfo  -flag PrintGC 1
-XX:-PrintGC

可以在不重启的情况下动态添加参数

jinfo  -flag  PrintGC 1
-XX:-PrintGC
jinfo  -flag  +PrintGC 1
jinfo  -flag  PrintGC 1
-XX:+PrintGC

jstack :生成虚拟机当前时刻的线程快照 堆栈信息

jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合.

通过jps获取java进程然后jstack 分析对应的pid

jstack 1 > java.txt
#将结果输出到文件中

2.1 Arthas使用

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?
  8. 怎样直接从JVM内查找某个类的实例?

安装方法

dockerfile中下载arthas jar

RUN wget https://arthas.aliyun.com/arthas-boot.jar

安装后在服务内java -jar arthas-boot.jar启动即可

[INFO] arthas-boot version: 3.6.2
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 test.jar
  [2]: 11985 arthas-boot.jar
1
[INFO] arthas home: /root/.arthas/lib/3.6.2/arthas
[INFO] Try to attach process 1
[INFO] Attach process 1 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    3.6.2
main_class
pid        1
time       2022-07-03 11:46:40

常用命令

dashboard
实时查看应用监控数据
thread

#查看应用程序中所有线程情况

thread Id #命令查看指定线程状态信息
thread -n {n} #打印最忙的n个线程的信息
trace
trace 类 方法查看每个步骤耗时
stack
stack 类 方法
输出当前方法被调用的调用路径
watch
方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行

MemoryAnalyzer 内存分析

下载

wget http://kode.huhuhahei.cn/kodexplorer/tar包/java内存分析/MemoryAnalyzer-1.13.0.20220615-linux.gtk.x86_64.zip
unzip MemoryAnalyzer-1.13.0.20220615-linux.gtk.x86_64.zip

解压后会得到一个mat的文件夹

jmap -dump:format=b,file=memory.dump `pid`
#执行后会得到 memory.dump 文件

使用解压后mat文件夹中ParseHeapDump.sh脚本分析memory.dump

./ParseHeapDump.sh memory.dump  org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

最终会生成三个zip文件

memory_Leak_Suspects.zip
memory_System_Overview.zip
memory_Top_Components.zip

Leak_Suspects.zip导出到本地电脑,解压出来会生成静态html,访问index.html即可看到分析内容

文章参考:

分析Java程序内存溢出、内存不断增长的原因

Java 线程调优


文章作者: huhuhahei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 huhuhahei !
评论
  目录