快捷搜索:

JVM 问题排查-可视化工具

JVM 问题排查-可视化工具

jconsole

JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。 命令行中输入:jconsole

jvisualvm

命令行中输入:jvisualvm Visual GC插件下载地址 :https://visualvm.github.io/pluginscenters.html

可以监控本地的java进程的CPU,类,线程等

在线调试Arthas

Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。 github :https://github.com/alibaba/arthas

下载安装 curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar or java -jar arthas-boot.jar -h # 然后可以选择一个Java进程

输入dashboard可查看整个进程的运行情况,线程、内存、GC、运行环境信息:

输入thread可以查看线程详细情况:

输入 thread加上线程ID 可以查看线程堆栈: 输入thread -b 可以查看线程死锁:

输入jad加类的全名可以反编译, 这样可以方便我们查看线上代码是否是正确的版本。

Arthas 命令集

基础命令:

    help——查看命令帮助信息 cat—打印文件内容,和linux里的cat命令类似 grep——匹配查找,和linux里的grep命令类似 pwd——返回当前的工作目录,和linux命令类似 cls——清空当前屏幕区域 session——查看当前会话的信息 reset (opens new window)——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类 version——输出当前目标 Java 进程所加载的 Arthas 版本号 history——打印命令历史 quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响 stop/shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出 ——Arthas快捷键列表及自定义快捷键

jvm相关:

    dashboard (opens new window)——当前系统的实时数据面板 thread (opens new window)——查看当前 JVM 的线程堆栈信息 jvm (opens new window)——查看当前 JVM 的信息 sysprop (opens new window)——查看和修改JVM的系统属性 sysenv (opens new window)——查看JVM的环境变量 vmoption (opens new window)——查看和修改JVM里诊断相关的option logger (opens new window)——查看和修改logger getstatic (opens new window)——查看类的静态属性 mbean (opens new window)——查看 Mbean 的信息 heapdump (opens new window)——dump java heap, 类似jmap命令的heap dump功能

class/classloader相关:

    sc (opens new window)——查看JVM已加载的类信息 sm (opens new window)——查看已加载类的方法信息 jad (opens new window)——反编译指定已加载类的源码 mc (opens new window)——内存编绎器,内存编绎.java文件为.class文件 redefine (opens new window)——加载外部的.class文件,redefine到JVM里 dump (opens new window)——dump 已加载类的 byte code 到特定目录 classloader (opens new window)——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关:

这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令

    monitor (opens new window)——方法执行监控 watch (opens new window)——方法执行数据观测 trace (opens new window)——方法内部调用路径,并输出方法路径上的每个节点上耗时 stack (opens new window)——输出当前方法被调用的调用路径 tt (opens new window)——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

内存分析MAT

Java堆分析器,用于查找内存泄漏 Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照。 它在触发快照的时候保存了很多信息:Java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC。 下载地址 :https://www.eclipse.org/mat/downloads.php

获取dump文件 手动:jmap -dump:format=b,file=heap.hprof 44808 自动:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

Dump的信息: All Objects Class, fields, primitive values and references All Classes Classloader, name, super class, static fields Garbage Collection Roots Objects defined to be reachable by the JVM Thread Stacks and Local Variables The call-stacks of threads at the moment of the snapshot, and per-frame information about local objects

使用: Histogram:可以列出内存中的对象,对象的个数及其大小 Class Name:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个 Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用 Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和

右击类名—>List Objects—>with incoming references—>列出该类的实例

右击Java对象名—>Merge Shortest Paths to GC Roots—>exclude all …—>找到GCRoot以及原因

Leak Suspects:查找并分析内存泄漏的可能原因:Reports—>Leak Suspects—>Details Top Consumers:列出大对象

heaphero

https://heaphero.io/

GC日志分析

要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下,根据前面参数的学习,下 面的配置很容易看懂。比如打开windows中的catalina.bat,在第一行加上

XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log

不同收集器日志 (1)Parallel GC:【吞吐量优先】

2019-06-10T23:21:53.305+0800: 1.303: [GC (Allocation Failure)
 [PSYoungGen: 65536K[Young区回收前]->10748K[Young区回收后](76288K[Young区总大小])]
            65536K[整个 堆回收前]->15039K[整个堆回收后](251392K[整个堆总大小]),
            0.0113277 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

(2)CMS:【停顿时间优先】 参数设置:-XX:+UseConcMarkSweepGC -Xloggc:cms-gc.log 这里产生的日志格式和上面差不多。

(3)G1:【停顿时间优先】 参数设置:-XX:+UseG1GC -Xloggc:g1-gc.log

GCViewer java -jar gcviewer-1.36-SNAPSHOT.jar

gceasy http://gceasy.io

gcplot https://it.gcplot.com/

经验分享 程序员 职场和发展