文章目录

  • 概述
  • 基础工具
    • jps
    • jstat
    • jinfo
    • jmap
    • jhat
    • jstack
  • 高级工具
    • VisualVM
      • VisualVM 的主要功能
    • Arthas
    • GC Easy

概述

在使用 Java 语言进行开发的过程中,我们很可能会遇到各种程序问题。
比如,可能会遇见程序突然就静止不动了,但是程序进程依然显示在后台进行;也可能会遇见程序莫名其妙地卡顿,甚至崩溃。当问题比较直观时,例如程序日志中明确地告诉你出现了一个 NPE 异常,出现在哪一行,那排查问题就会顺畅很多。
但是很多时候出现的问题可能没有那么直观,所以我们需要学习使用一些工具来排查问题,或者进行性能监控。

基础工具

基础工具,这里主要介绍由 JDK 自带的几个用于查看或追踪 Java 应用运行情况的命令行工具。

jps

jps,即 Java Process Status。从名字就可以看出,这是个与 Java 进程相关的的命令行工具。
这个命令用于列出正在运行的 Java 进程,并显示该进程中虚拟机执行的主类。例如:

可以看出,所有运行中的 Java 进程都被打印出来了,打印出来的信息中有两列,前一列是进程的 id,后一项是虚拟机执行的主类(运行 Main 方法的类)
jps 命令是一个非常常用,也是非常实用的命令,在后续介绍的工具中,基本都需要先使用 jps 命令获取对应程序的进程 id 后才能使用

jstat

jstat,即 JVM Statistics Monitoring Tool,是一个用于监控虚拟机各种运行信息的命令行工具。
它可以显示当前运行的 Java 进程中的内存使用情况、类加载数据、垃圾收集信息等实时运行数据,功能十分强大。
jstat 主要的参数有:

  • -class:显示当前类加载相关信息
  • -gc:显示当前虚拟机堆以及方法区的使用情况,以及垃圾收集相关的数据

比较常用的是 -gc 参数,格式为:jstat -gc 进程 id。例如:

可以看出,指定的 Java 进程的垃圾收集相关信息都被打印了出来,在排查内存问题时比较常用

jinfo

jinfo,即 Configuration Info For Java,是一个用于查看和调整虚拟机各项参数的命令行工具。
它的功能主要分为以下几个部分:

  • 不指定参数时,查看所有参数的值
  • -flag 参数查看指定参数的值
  • -flags 参数查看未显式指定的参数对应的值(默认值)
  • JDK 6 以后,可以使用 -flag 参数动态修改部分参数值

使用的格式为:jinfo [option] 进程 id。例如:

可以看出,15848 这个进程的最大堆内存空间大小为 734003200 bit

jmap

jmap,即 Memory Map For Java,是一个用于生成堆转储快照(堆 dump 文件)的命令行工具。
通常情况下,当我们需要查看堆内各对象的存活情况时,就需要用到dump 文件。堆 dump 文件即触发堆转储那一刻的堆内使用情况快照,内部包含了各对象的存活情况及引用链等信息,对于问题定位有非常大的帮助。
获取堆 dump 文件我们也可以设置当出现 OOM 异常时,让虚拟机自动转储堆 dump 文件到指定目录。如果想要在虚拟机正常运行时获取堆 dump 文件,就需要用到 jmap 命令了。
jmap 命令除了获取堆 dump 文件之外,还可以查询 finalize 执行队列,当前使用垃圾收集器种类等信息。
jmap 命令的主要参数为:

  • -dump:生成堆 dump 文件
  • -heap:显示当前使用的垃圾收集器种类等信息

在日常开发过程中,用的比较多的还是生成堆 dump 文件,格式为 jmap -dump:format=b,file=文件位置 进程 id,例如:

可以看出,使用了 jmap -dump 后,在指定位置创建了堆 dump 文件

jhat

jhat,即 JVM Heap Analysis Tool,是一个用于分析堆 dump 文件的命令行工具。
当我们使用 jmap 获取了堆 dump 文件后,我们是不能直接打开查看文件的,因为里面是用特殊的文件格式来书写的,所以我们需要借助工具才能看得懂里面的内容。而 jhat 就是一个用于分析堆 dump 文件的工具。
用法也非常简单,格式为 jhat dump 文件的路径 即可,例如:

在使用了 jhat 命令后,它会创建一个 Web 服务,用于查看分析结果,例如图中提示我们在 7000 端口上启动了一个服务,我们打开 localhost:7000 查看的结果为:

可以看到,jhat 的分析结果在网页中就展示出来了,页面上的每个超链接都可以继续点击进去查看进一步的分析结果。
但是在实际应用中,jhat 是比较少用的,因为首先 jhat 的分析结果过于粗糙,难以提取有用的信息;其次 JDK 为我们提供了其他更好用的图形化界面用于分析并查看堆 dump 文件;最后,运行 jhat 命令比较占用系统资源,在堆文件比较大时可能会造成系统卡顿。

jstack

jstack,即 Stack Trace for Java,是一个用于生成虚拟机当前时刻的线程快照(threaddump 文件)的命令行工具。
线程快照,就是正在运行的 Java 线程内某一时刻每一个线程正在运行的方法的堆栈的集合。当正在运行的程序中出现某个请求迟迟不响应,或者说某个线程长时间停顿的情况时,可以使用 jstat 命令查看相关线程的当前执行堆栈情况来定位问题的原因。
常用的参数为:

  • 不使用任何参数时,将会打印这个进程内的所有 Java 线程的堆栈运行情况
  • -l 参数将会额外显示关于锁的相关信息
  • -m 参数将会把本地方法的执行堆栈也显示出来

比较常用的是 -l 参数,用法为 jstack -l 进程 id,例如:

可以看到,该命令把线程的堆栈信息都打印了出来,由于加了 -l 参数,还出现了锁相关信息 Locked ownable synchronizers 的内容

高级工具

高级工具,主要指的是多功能合一的,对于问题定位能力有极大提升的工具。这里主要介绍下面几款:

  • JDK 自带的 VisualVM
  • 阿里开源的 Arthas
  • 在线 GC 诊断工具 GC Easy

VisualVM

VisualVM ,官方名称为 All-in-One Java Troubleshooting Tool,是功能最强大的 Java 运行监控和故障处理程序之一。
从名称就可以看出,这肯定是一个多种功能合一的工具。事实也确实如此,它除了常规的运行监控与故障处理外,还提供了性能分析,扩展插件等功能。除此之外,jvisualvm 还有个非常大的优点:对于被监控的 Java 程序完全无侵入,不需要基于特殊的运行方式,或者定制化的 Agent 去运行。
VisualVM 的启动方式也很简单,只需要在命令行输入 jvisualvm 即可启动

VisualVM 的主要功能

VisualVM 的主要功能如下所示:

  • 显示当前系统上运行的所有 Java 进程与其环境信息(jpsjinfo 命令的功能)
  • 监控 Java 程序的垃圾收集相关信息,与堆、方法区的内存使用信息(jstat 命令的功能)
  • 监控 Java 程序当前所有线程的堆栈信息(jstack 命令的功能)
  • 创建堆 dump 文件,以及分析堆 dump 文件(jmapjhat 命令的功能)
  • 多维度(方法,线程)进行性能分析,可以找出各维度下耗时最长,性能最低下的数据条目
  • 其他扩展插件带来的功能,例如 Visual GC 插件,可以将堆内存的使用情况及 GC 过程通过可视化的界面展示出来

Arthas

Alibaba 开源的一个 JVM 监控工具,非常好用,可以在 linux 环境下运行后查看无图形化的图标界面

  • 可以通过 jad 命令反编译线上发布的代码,查看是否发布成功了
  • 可以通过 dashboard 命令,查看统计图表命令
  • 可以通过 thread 命令查看现在线程的所有状态,-b 参数查看是否有死锁的线程
  • 可以通过 ognl 命令查看系统线上变量的值,或者执行线上代码!!

如果线上是集群部署的应用,那么可以通过 zabbix 或者普罗米修斯等集群监控工具先定位到是哪台机器出了问题,然后再在这台机器上执行 arthas 相关命令。
官网地址为:Arthas

GC Easy

这是一款在线且收费GC 分析工具,可以通过上传 GC 日志文件,或者堆 dump 文件来给出调优意见,可以在完全不懂业务代码的情况下,根据这个工具提供的意见,进行 JVM 的参数调优,可以称作是傻瓜式的 JVM 调优工具。
官网地址为:GC Easy

Java 故障处理与性能监控工具相关推荐

  1. Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

    添加链接描述 tomcat内存溢出问题记录 Java程序堆内存使用率很高的一般分析思路

  2. Java 自带性能监控工具:监视和管理控制台jconsole的使用

    关于JConsole工具的使用请参见:http://blog.csdn.net/defonds/article/details/45064297

  3. 性能监控工具-JDK性能监控

    实战java虚拟机 JDK性能监控工具 jdk开发包中,除了比较熟悉的java.exe,javac.exe,还有一系列的辅助工具,它们都存放在jdk安装目录/bin目录下,乍一看这些都是exe,但实际 ...

  4. linux java性能监控工具_性能监控工具以及java堆分析OOM

    一.性能监控工具 1.系统性能监控 Linux -确定系统运行的整体状态,基本定位问题所在 -uptime: ------系统时间 ------运行时间(例子中为127天) ------连接数(每个终 ...

  5. java cpu 监控工具_Java自带的GUI性能监控工具Jconsole以及JisualVM简介

    1 Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具.下面以对tomcat的监控为例,带领大家熟悉Jc ...

  6. 监控程序必须要放到服务器上进行吗?_五大最佳开源java性能监控工具,你知道几个?...

    如果你正在寻找性能监控工具,不妨看看以下推荐的这五款开源工具,这些工具目前已经可以替代付费工具了,你可以看看是否是你的最佳选择.本文推荐的五款开源工具目前是开源社区中最受欢迎的. 1. Stagemo ...

  7. 老李分享:JAVA性能监控工具

    老李分享:JAVA性能监控工具 1.问题 OutOfMemoryError: 内存不足: 内存泄漏 线程死锁 锁竞争(Lock Contention) java消耗过多的CPU 2.java常用健康工 ...

  8. 五大最佳开源java性能监控工具

    五大最佳开源java性能监控工具-IT168 技术开发专区 http://tech.it168.com/a2017/0120/3093/000003093435.shtml

  9. Java的JVM性能监控与故障处理工具详细介绍以及使用案例

    给一个系统定位问题的时候,知识.经验是关键基础,数据是依据.工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照文件(threaddump/javacore文件).堆 ...

最新文章

  1. Zookeeper知识学习
  2. tomcat 4.0头文件及maven导出问题万能build模板
  3. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
  4. 域名的MX设置及校验方法
  5. ElasticSearch IK 分词器快速上手
  6. 机器学习笔记III: 基于支持向量机的分类预测
  7. java输出目录节点_节点如果不存在,如何创建目录?
  8. 培养一个数据人才需要多少年?
  9. 用记事本编写一个Servlet项目
  10. Python从头开始的演变策略
  11. SQLPrompt 注册失效方法
  12. 中国省级行政区划变动情况
  13. oppo手机解锁_ColorOS一键解锁工具
  14. 仪器仪表的标定、检定、校准、校验的区别【图文详解】
  15. matlab如何插入“埃”这个符号
  16. Java使用Spring Boot、Maven、Spring RestTemplate集成腾讯云通信
  17. 2022茶艺师(中级)国家题库模拟考试平台操作
  18. Thread 1: signal SIGABRT解决方法之一
  19. 崩坏3服务器维护多久,崩坏34月25日停机维护到几点_4月25日崩坏3停机维护时间_玩游戏网...
  20. 学大伟业 Day 2 培训总结

热门文章

  1. shell中返回值是1为真还是假_shell脚本中判断上一个命令是否执行成功
  2. ansys添加力矩_ANSYS软件中施加扭矩的方法
  3. python爬取天气预报源代码_python抓取天气并分析 实例源码
  4. html window 属性,html中window对象top 、self 、parent 等属性
  5. IRCTC的完整形式是什么?
  6. 面经分享:历时半个月,终于拿到了蚂蚁金服的offer!
  7. oracle 序列的概念与使用步骤
  8. STM32——PID恒温控制
  9. 【Jetson-Nano】2.Tensorflow和Pytorch的安装
  10. texlive 2020下载与安装