• 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

    不同收集器日志
    (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]
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    (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/

  • 相关阅读:
    如何平衡需求的优先级冲突?
    算法工程师跳槽至B站被原公司索赔200万,法院二审判决:无需赔偿
    网络技术八:Vlan和Trunk基础
    metersphere后置脚本提取响应头,响应体;
    码蹄集 - MT2165 - 小码哥的抽卡之旅1
    电容式雨雪传感器
    数据挖掘实战(4)——聚类(Kmeans、MiniBatchKmeans、DBSCAN、AgglomerativeClustering、MeanShift)
    微服务篇之负载均衡
    云小课|帮您高效快速上传组件至私有依赖库
    Linux 文件搜索命令:find
  • 原文地址:https://blog.csdn.net/bsegebr/article/details/126410371