JVM学习-Arthas

Arthas

  • Alibaba开源的Java诊断工具,在线排查问题,无需重启,动态跟踪Java代码,实时监控JVM状态
  • Arthas支持JDK6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断
  • Arthas可以帮助我们解决以下问题
    • 这个类从哪个jar包加载的?为什么会报各种类相关的Exception
    • 我改的代码为什么没有执行到?难道我没commit?分支搞错了
    • 遇到问题无法在线上debug,难道只能通过日志重新发布吗
    • 线上遇到某个用户的数据处理问题,但线上同样无法debug,线下无法重现
    • 是否有一个全局视角来查看系统的运行情况
    • 有什么办法可以监控到JVM的实时运行情况
    • 怎样快速定位应用的热点,生成火焰图?
  • 基于哪些工具开发而来
    • greys-anatomy:Arthas基于Greys二次开发而来
    • termd:是一款优秀的命令行程序开发框架
    • crsh:Arthas的文本渲染功能基于Crash中的文本渲染功能开发
    • cli:Arthas的命令行界面基于vert.x提供的cli库进行开发
    • compiler:Arthas里的内存编译器代码来源
    • Apache Commons Net :Arthas里的Telnet Client代码来源
    • Java Agent:运行在main方法之前的拦截器,它内定的就去名叫premain,先执行premain方法,然后执行main方法
    • ASM:一个通用的Java字节码操作和分析框架,它可以用于修改现有的类或直接以二进制形式动态生成类,ASM提供了一些常见的字节码转换和分析算法,可以从它们构建定制的复杂转换和代码分析工具,它的设计和实现就可能小和快,更关注性能,非常适合在动态系统中使用
Arthas安装
  • ①先在Linux上安装JDK,设置环境变量
    测试代码
[root@mysql8 ~]# ls
anaconda-ks.cfg  jdk-8u411-linux-x64.tar.gz  logs  mysql80-community-release-el7-11.noarch.rpm
[root@mysql8 ~]# tar xf jdk-8u411-linux-x64.tar.gz 
[root@mysql8 ~]# mv jdk1.8.0_411 /usr/local/
#配置环境变量,使用JDK可用
[root@mysql8 ~]# tail -2 /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_411
export PATH=$PATH:$JAVA_HOME/bin
#下载arthas
[root@mysql8 ~]# curl -O https://arthas.aliyun.com/arthas-boot.jar
#执行死锁程序代码
[root@mysql8 /]# java ThreadDeadLock
#重新打开一个容口,启动Arthas[root@mysql8 /]# java -jar arthas-boot.jar
[INFO] JAVA_HOME: /usr/local/jdk1.8.0_411/jre
[INFO] arthas-boot version: 3.7.2
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1568 ThreadDeadLock
1
[INFO] arthas home: /root/.arthas/lib/3.7.2/arthas
[INFO] Try to attach process 1568
[INFO] Attach process 1568 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.7.2
main_class
pid        1568
time       2024-06-06 21:37:48
#arthas默认监听本地IP127.0.0.1,远程主机无法访问,启动arthas时通过--target-ip参数修改远程连接IP
[root@mysql8 /]# java -jar arthas-boot.jar --target-ip 192.168.29.201
#[arthas@2081]$显示表示正确进入监控客户端,可以执行相应命令进行查看
#退出arthas(quit/exit)
#使用stop/shutdown:关闭arthas服务器,并退出客户端
[arthas@2081]$ quit
#查看arthas日志文件--默认在用户家目录下logs/arthas目录下arthas.log文件
[root@mysql8 /]# cat ~/logs/arthas/arthas.log
#查看帮助
[root@mysql8 /]# java -jar arthas-boot.jar -h

在这里插入图片描述

命令使用
基础指令
  • help:查看命令帮助信息,可以查看当前 arthas 版本支持的指令,或者查看具体指令的使用说明
  • cat:打印文件内容,和 linux 里的 cat 命令类似。
  • echo:打印参数,和 linux 里的 echo 命令类似。
  • grep:类似传统的grep命令,匹配查找
  • tee:tee 指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
  • pwd:返回当前的工作目录,和 linux 命令类似
  • cls:清空当前屏幕区域。注:非终端模式下使用 cls 指令,会提示"Command ‘cls’ is only support tty session."。
  • session:查看当前会话的信息,显示当前绑定的 pid 以及会话 id。
  • reset:重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端stop时会重置所有增强过的类
  • version:输出当前目标 Java 进程所加载的 Arthas 版本号
  • history:打印命令历史。
  • quit:退出当前 Arthas 客户端,其他 Arthas 客户端不受影响。等同于exit、logout、q三个指令
  • stop:关闭 Arthas 服务端,所有 Arthas 客户端全部退出。
  • keymap:keymap命令输出当前的快捷键映射表:
[arthas@2299]$ version
3.7.2
[arthas@2299]$ pwd
/
[arthas@2299]$ sessionName        Value
--------------------------------------------------JAVA_PID    2299SESSION_ID  e0bf1234-57b0-478e-920b-08063ccf714b
[arthas@2299]$ echo 123
123
[arthas@2299]$ history1  cd /root/.arthas/lib/3.7.2/arthas2  jps... ...
[arthas@2299]$ stop
Resetting all enhanced classes ...
Affect(class count: 0 , method count: 0) cost in 0 ms, listenerId: 0
Arthas Server is going to shutdown...
[arthas@2299]$ session (e0bf1234-57b0-478e-920b-08063ccf714b) is closed because server is going to shutdown.
JVM相关
  • dashboard - 当前系统的实时数据面板
    • [i:] 刷新实时数据的时间间隔 (ms),默认 5000ms
    • [n:] 刷新实时数据的次数
  • getstatic - 查看类的静态属性
  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
  • jvm - 查看当前 JVM 的信息
  • logger - 查看和修改 logger
  • mbean - 查看 Mbean 的信息
  • memory - 查看 JVM 的内存信息
  • ognl - 执行 ognl 表达式
  • perfcounter - 查看当前 JVM 的 Perf Counter 信息
  • sysenv - 查看 JVM 的环境变量
  • sysprop - 查看和修改 JVM 的系统属性
  • thread - 查看当前 JVM 的线程堆栈信息
    • id 线程 id
    • [n:] 指定最忙的前 N 个线程并打印堆栈
    • [b] 找出当前阻塞其他线程的线程
    • [i ] 指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
    • [–all] 显示所有匹配的线程
  • vmoption - 查看和修改 JVM 里诊断相关的 option
  • vmtool - 从 jvm 里查询对象,执行 forceGc
#输入dashboard显示相应信息--动态刷新屏幕
[arthas@1568]$ dashboard
ID    NAME                              GROUP            PRIORITY   STATE      %CPU        DELTA_TIME TIME       INTERRUPTED DAEMON
-1    C2 CompilerThread0                -                -1         -          0.0         0.000      0:0.282    false       true
-1    C1 CompilerThread1                -                -1         -          0.0         0.000      0:0.258    false       true
-1    VM Periodic Task Thread           -                -1         -          0.0         0.000      0:0.150    false       true
-1    GC task thread#1 (ParallelGC)     -                -1         -          0.0         0.000      0:0.092    false       true
-1    GC task thread#0 (ParallelGC)     -                -1         -          0.0         0.000      0:0.090    false       true
10    DestroyJavaVM                     main             5          RUNNABLE   0.0         0.000      0:0.085    false       false
22    arthas-NettyHttpTelnetBootstrap-3 system           5          RUNNABLE   0.0         0.000      0:0.055    false       true
-1    VM Thread                         -                -1         -          0.0         0.000      0:0.045    false       true
11    Attach Listener                   system           9          RUNNABLE   0.0         0.000      0:0.021    false       true
16    arthas-NettyHttpTelnetBootstrap-3 system           5          RUNNABLE   0.0         0.000      0:0.017    false       true
8     Thread-0                          main             5          BLOCKED    0.0         0.000      0:0.007    false       false
Memory                       used      total     max      usage     GC
heap                         19M       74M       839M     2.27%     gc.ps_scavenge.count              5
ps_eden_space                1M        30M       301M     0.47%     gc.ps_scavenge.time(ms)           78
ps_survivor_space            0K        2560K     2560K    0.00%     gc.ps_marksweep.count             1
ps_old_gen                   17M       41M       629M     2.80%     gc.ps_marksweep.time(ms)          39
nonheap                      27M       28M       -1       97.60%
code_cache                   4M        4M        240M     1.83%
metaspace                    20M       21M       -1       97.59%
Runtime
os.name                                                             Linux
os.version                                                          3.10.0-1160.el7.x86_64
java.version                                                        1.8.0_411
java.home                                                           /usr/local/jdk1.8.0_411/jre
systemload.average                                                  0.00
processors                                                          2
#-------------------------------thread ---------------------------------
[arthas@2299]$ thread
Threads Total: 22, NEW: 0, RUNNABLE: 8, BLOCKED: 2, WAITING: 3, TIMED_WAITING: 2, TERMINATED: 0, Internal threads: 7
ID    NAME                              GROUP            PRIORITY   STATE      %CPU        DELTA_TIME TIME       INTERRUPTED DAEMON
46    arthas-command-execute            system           5          RUNNABLE   0.18        0.000      0:0.002    false       true
-1    VM Periodic Task Thread           -                -1         -          0.12        0.000      0:0.230    false       true
-1    C1 CompilerThread1                -                -1         -          0.05        0.000      0:0.406    false       true
-1    C2 CompilerThread0                -                -1         -          0.0         0.000      0:0.442    false       true
2     Reference Handler                 system           10         WAITING    0.0         0.000      0:0.001    false      
#-------------------------------thread ---------------------------------
#-------------------------------生成dump文件
[arthas@2299]$ heapdump /tmp/OOMTest.hprof
Dumping heap to /tmp/OOMTest.hprof ...
Heap dump file created
class/classloader相关
  • classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
  • dump - dump 已加载类的 byte code 到特定目录
  • jad - 反编译指定已加载类的源码
  • mc - 内存编译器,内存编译.java文件为.class文件
  • redefine - 加载外部的.class文件,redefine 到 JVM 里
  • retransform - 加载外部的.class文件,retransform 到 JVM 里
  • sc - 查看 JVM 已加载的类信息
    • class-pattern 类名表达式匹配
    • method-pattern 方法名表达式匹配
    • [d] 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。
      如果一个类被多个 ClassLoader 所加载,则会出现多次
    • [E] 开启正则表达式匹配,默认为通配符匹配
    • [f] 输出当前类的成员变量信息(需要配合参数-d 一起使用)
    • [x:] 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出
    • [c:] 指定 class 的 ClassLoader 的 hashcode
    • [classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
    • [n:] 具有详细信息的匹配类的最大数量(默认为 100)
    • [cs ] 指定 class 的 ClassLoader#toString() 返回值。长格式[classLoaderStr ]
  • sm - 查看已加载类的方法信息
    • class-pattern 类名表达式匹配
    • method-pattern 方法名表达式匹配
    • [d] 展示每个方法的详细信息
    • [E] 开启正则表达式匹配,默认为通配符匹配
    • [c:] 指定 class 的 ClassLoader 的 hashcode
    • [classLoaderClass:] 指定执行表达式的 ClassLoader 的 class name
    • [n:] 具有详细信息的匹配类的最大数量(默认为 100)
monitor/watch/trace相关
  • monitor - 方法执行监控
  • stack - 输出当前方法被调用的调用路径
  • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
  • tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
  • watch - 方法执行数据观测
其它
  • profiler - 使用async-profiler对应用采样,生成火焰图

官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

makefile2

makefile的条件判断 运行make。 替换 make -c make-f …… 还可以 man make来查看其他的make命令。

Vue3的ref创建一个全局变量,非常好用!

1. 前言 Vue3的ref对象我们都知道其用法,通过ref可以创建一个响应式对象使用,同时可以用compute,watch等Vue3的API对其进行操作 不同于Vue2的是,Vue3使用的是组合式API,这也就意味着,我可以在外部单独创建一个ref对象,然后保存,通过导出的方式,给其他的页面使用 理论存在,开始…

SpringBoot高手之路04-Aop

文章目录 AOP 基础AOP概述start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖都会下载下来 AOP快速入门AOP核心概念 切入点表达式-execution AOP 基础 AOP概述 AOP 对特定的方法做增强 AOP 快速入门 start依赖,开发某一个功能,只需要下载这一个依赖,关于他的依赖…

快速上手 ngrok:将你的本地服务一键暴露到互联网,开发者必备技能!

想让外界轻松访问你本地电脑上的项目?试试 ngrok 吧!无论是调试 Web 应用,还是进行跨网络测试,ngrok 都能帮你一键创建安全隧道,将本地服务映射到公共 URL,让全球任何地方都能访问。本文详细介绍 ngrok 的安…

【Spring框架全系列】SpringBoot_基础_先知(详细)

文章目录 1.SpringBoot介绍2.创建一个SpringBoot项目3.parent标签 - 父工程4.starter依赖5.启动类和文件打包6.默认配置 1.SpringBoot介绍 Spring阶段最困扰大家的事情是什么? 配置 → 配置魔鬼 快速搭建一个独立的生产级别的Spring应用 快速引入项目相关依赖 开箱…

【漏洞复现】I Doc View 在线文档预览 qJvqhFt.json 任意文件读取漏洞(XVE-2024-2115)

0x01 产品简介 iDocView是一个在线文档解析应用,旨在提供便捷的文件查看和编辑服务。 0x02 漏洞概述 iDocView是一个在线文档预览系统 /iew/gJvghftjson 接口处存在任意文件读取漏洞,未授权的攻击者可以利用此接口并携带默认token读取服务器敏感文件信…

表格中附件的上传、显示以及文件下载#Vue3#后端接口数据

表格中附件的上传及显示#Vue3#后端接口数据 一、图片上传并显示在表格中实现效果&#xff1a; 表格中上传附件 代码&#xff1a; <!-- 文件的上传及显示 --> <template><!-- 演示地址 --><div class"dem-add"><!-- Search start -->…

【推荐】用scss循环zoom缩放比例,解决可视化大屏在不同分辨率屏幕下的适配问题

方法1&#xff1a; 指定几种常规屏幕宽度&#xff08;用这种方式就必须要强制用户全屏查看页面&#xff0c;在固定的宽度下才能达到比较不错的显示效果&#xff09; // 适配不同分辨率的页面---------------------------------------- html {overflow: hidden;width: 1920px;…

SQL语句练习每日5题(二)

题目1——查找学校是北大的学生信息 筛选出所有北京大学的学生进行用户调研&#xff0c;请你从用户信息表中取出满足条件的数据&#xff0c;结果返回设备id和学校。 解法&#xff1a;考察where条件语句 select device_id,university from user_profile where university北京…

python数据文件处理库-pandas

内容目录 一、pandas介绍二、数据加载和写出三、数据清洗四、数据转换五、数据查询和筛选六、数据统计七、数据可视化 pandas 是一个 Python提供的快速、灵活的数据结构处理包&#xff0c;让“关系型”或“标记型”数据的交互既简单又直观。 官网地址: https://pandas.pydata.o…

今日arXiv最热大模型论文:大模型都能怎么用?中南大学最新综述:大模型时代的自然语言处理

还记得2022年末ChatGPT的横空出世&#xff0c;带来了整个NLP乃至AI领域的震动&#xff0c;随后如LLaMA、ChatGLM、Qwen等类ChatGPT大模型&#xff08;LLM&#xff09;开始如雨后春笋般涌现&#xff0c;这些先进的模型不仅展示了在零样本学习中的出色表现&#xff0c;还在多种NL…

树形表/树形数据接口的开发

数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…

stm32 定时器输出比较(OC)与PWM的理解和应用

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;公众号 xxh_zone&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业了7年多&am…

保姆级讲解 FTP服务器的配置与管理

本来目录很长的 因为感觉不太美观 所以小标题都删掉了 本文介绍了 本地用户的FTP服务器搭建实例匿名用户的FTP服务器搭建实例虚拟用户的FTP服务器搭建实例企业常见类型搭建实验 配置与管理FTP服务器 配置与管理FTP服务器一、FTP相关知识二、项目设计与准备三、项目实施四、认识…

智慧引领,树莓集团创新式园区运营新实践

在当今经济快速发展的时代&#xff0c;产业园区作为推动地方经济增长、优化产业布局的重要平台&#xff0c;其运营和管理水平的重要性日益凸显。树莓集团&#xff0c;作为成都数字产业园的运营先锋&#xff0c;始终秉持“创新驱动、服务至上”的理念&#xff0c;致力于打造集科…

【System Verilog and UVM基础入门4】程序和接口

目录 方法task和函数function 接口 [System Verilog特性] 方法task和函数function 首先要明白一个事情!Task任务,是消耗时间的,函数function是不消耗时间的! 这样写看着是不是很高大上呢?此外,如果我们想修改时钟周期怎么办呢?这时我们可以在task clk_gen(int period…

【html】如何用html+css写出一个漂亮的“众成教育”页面

先来看看效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>* {margin: 0;padding: 0;/* border: 2px solid #000; */}.con {width: 1000px;height: 840px…

【精通NIO】NIO介绍

一、什么是NIO NIO&#xff0c;全称为New Input/Output&#xff0c;是Java平台中用于替代传统I/O&#xff08;Blocking I/O&#xff09;模型的一个功能强大的I/O API。NIO在Java 1.4版本中被引入&#xff0c;其设计目标是提供一种非阻塞的、低延迟的I/O操作方式&#xff0c;以…

2024百度之星 跑步

原题链接&#xff1a;码题集OJ-跑步 题目大意&#xff1a;一个n个人在绕圈跑&#xff0c;第i个人跑一圈的时间是i分钟&#xff0c;每二个人位置相同就会打一次招呼&#xff0c;如果同时来到终点&#xff0c;他们就会停下来&#xff0c;请问会打多少次招呼&#xff1f; 思路&a…

SpringCloud网关-gateway

一 什么是网关&#xff1f;为什么选择 Gateway? 网关功能如下&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 在 Spring Cloud 中网关的实现包含两种&#xff1a; Gateway&#xff08;推荐&#xff09;&#xff1a;是基于 Spring5 中提供的 WebFlux &#xff…