【Java虚拟机】JVM诊断神器Arthas入门实操

news2024/11/25 6:17:43

1.Arthas简介快速入门

在这里插入图片描述

  • 阿里开源的Java诊断工具,它可以在运行时对Java应用程序进行动态诊断和调试

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

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

  • 官网:https://arthas.aliyun.com/

  • 版本:Arthas-3.6.7

  • 环境说明

    • Arthas 支持 JDK 6+,支持 Linux/Mac/Windows,采用命令行交互模式,
    • 提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断
    • 也支持浏览器直接访问对应的ip+端口,固定端口 8563
    • 默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,使用 --target-ip参数指定 listen 的 IP
  • 快速使用

    • 启动 java -jar arthas-boot.jar

    在这里插入图片描述

    • 运行日志路径 ~/logs/arthas/arthas.log

    在这里插入图片描述

  • 退出 arthas

    • 如果只是退出当前的连接,其他客户端不受影响,可以用 quit或者exit命令
    • 目标进程上的 arthas 还会继续运行,端口保持开放,下次连接时执行java -jar arthas-boot.jar可以直接连接上
    • 如果想完全退出 arthas,可以执行stop命令

2.Arthas常用基础命令实战

  • version - 输出当前目标 Java 进程所加载的 Arthas 版本号

  • base64 - base64 编码转换,和 linux 里的 base64 命令类似

  • cat - 打印文件内容,和 linux 里的 cat 命令类似

  • cls - 清空当前屏幕区域

  • echo - 打印参数,和 linux 里的 echo 命令类似

  • grep - 匹配查找,和 linux 里的 grep 命令类似

  • help - 查看命令帮助信息

  • history - 打印命令历史

  • keymap - Arthas 快捷键列表及自定义快捷键

  • pwd - 返回当前的工作目录,和 linux 命令类似

  • quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响

  • reset - 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类

  • session - 查看当前会话的信息

  • stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出

  • tee - 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似

在这里插入图片描述

3.Arthas常用JVM命令案例实战

(1)JVM相关的命令

  • dashboard - 当前系统的实时数据面板
  • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
  • jvm - 查看当前 JVM 的信息
  • memory - 查看 JVM 的内存信息
  • ognl - 执行 ognl 表达式
  • perfcounter - 查看当前 JVM 的 Perf Counter 信息
  • sysenv - 查看 JVM 的环境变量
  • sysprop - 查看和修改 JVM 的系统属性
  • thread - 查看当前 JVM 的线程堆栈信息
  • vmoption - 查看和修改 JVM 里诊断相关的 option

(2)dashboard - 当前系统的实时数据面板

  • 整体大面板

在这里插入图片描述

  • 顶部-线程的基本信息

在这里插入图片描述

字段说明
idJava 级别的线程 ID
name线程名称
group线程组名称
proirity线程优先级,1 ~ 10 之间的数字,越大优先级越高
state线程的状态
cpu线程的 cpu 使用率
delta_time上次采样之后线程运行增量 CPU 时间,数据格式为秒
time线程运行总 CPU 时间,数据格式为 分:秒
interupted当前线程是否中断
daemon是否是 daemon 守护线程
  • 中部-堆内存的使用情况

在这里插入图片描述

字段说明
used当前使用了多少内存
total总共分配了多少内存
max最大使用了多少
usage使用比例
gc垃圾回收器
  • 底部-操作系统信息,JDK版本

在这里插入图片描述

(3)thead - 查看当前 JVM 的线程堆栈信息

  • 常用参数

    • –all :显示所有匹配的线程,默认就是第一页线程信息

    在这里插入图片描述

    • -i:设置cpu统计时的采样间隔,单位为毫秒 thread -i 2000

    在这里插入图片描述

    • [ id ]:查看指定ID的线程堆栈 thread 54

    在这里插入图片描述

    • -n :查看CPU使用率最高的TopN个线程, 如果值为-1表示显示所有线程 thread -n 3

    在这里插入图片描述

    • -b :展示阻塞线程 thread -b

    在这里插入图片描述

    • –state : 根据线程状态筛选线程 thread --state TIMED_WAITING
      • 状态类型:NEW, RUNNABLE, TIMED_WAITING, WAITING, BLOCKED,TERMINATED

    在这里插入图片描述

(4)heapdump - 类似 jmap 命令的 heap dump 功能

  • 生成堆栈快照 heapdump /Users/mac/Desktop/heapdump.hprof
    在这里插入图片描述在这里插入图片描述

(5)jvm - 查看当前 JVM 的信息

在这里插入图片描述

(6)sysenv - 查看 JVM 的环境变量

在这里插入图片描述

(7)sysprop - 查看和修改 JVM 的系统属性

  • 查看所有属性:sysprop

在这里插入图片描述

  • 查看单个属性:sysprop java.version

在这里插入图片描述

  • 修改某个属性:sysprop user.country CN

在这里插入图片描述

(8)sc - 查看 JVM 已加载的类信息

  • -d 详情,-f 类属性输出
  • sc -d -f com.lixiang.controller.SpringTestController

在这里插入图片描述

(9)sm - 查看已加载类的方法信息

  • sm -d com.lixiang.controller.SpringTestController

在这里插入图片描述

(10)jad - 反编译指定已加载类的源码

  • 反编译整个类 jad com.lixiang.SpringTestApplication

在这里插入图片描述

  • 通过--source-only选项,可以只打印源代码

在这里插入图片描述

  • 应用场景
    • 查看某个类的业务逻辑,方法逻辑
    • 查看本地修改的代码是否线上成功生效

4.Arthas方法诊断命令案例实战

(1)monitor - 方法执行监控

  • 非实时响应,需要对应的方法有被调用才行,所以需要触发web接口请求
  • 监视一个时间段中指定方法的执行次数,成功次数,失败次数,耗时等这些信息
  • monitor -c 2 com.lixiang.controller.SpringTestController query

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

(2)stack - 输出当前方法被调用的调用路径, 一个方法被执行的路径非常多,不知道这个方法是从那里被执行,就可以采用

  • 案例 stack com.lixiang.controller.SpringTestController query

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

(3)trace - 方法内部调用,输出方法路径上的每个节点上耗时, 定位因 RT 高导致的性能问题

  • 每次只能跟踪一级方法的调用链路

  • 案例输出全部方法 trace com.lixiang.controller.SpringTestController *

    • ts: 时间戳,表示日志记录的时间,该字段的值为2023年3月26日下午5点48分46秒。
    • thread_name: 线程名称,表示当前执行该日志记录的线程名称,该字段的值为http-nio-8080-exec-10。
    • id: 线程ID,表示当前执行该日志记录的线程ID,该字段的值为20。
    • is_daemon: 是否为守护线程,该字段的值为true,表示该线程是守护线程。
    • priority: 线程优先级,该字段的值为5,表示该线程的优先级为5。
    • TCCL: 线程上下文类加载器,表示当前线程的上下文类加载器为TomcatEmbeddedWebappClassLoader。

在这里插入图片描述

  • 默认情况下,trace不会包含jdk里的函数调用,如果希望trace jdk里的函数, 需要显式设置–skipJDKMethod false
  • trace --skipJDKMethod false com.lixiang.controller.SpringTestController *

在这里插入图片描述

(4)watch - 方法执行数据观测

  • 应用场景:查看方法调用栈,参数入参,返回值等调试
  • 默认的 观察表达式,默认值是{params, target, returnObj}
  • 也可以指定观察返回值 watch com.lixiang.controller.SpringTestController * {params,returnObj}

在这里插入图片描述

  • 展开里面具体的值 -x 参数表示遍历深度,可以调整来打印具体的参数和结果内容,默认值是 1, 最大是4。

  • watch com.lixiang.controller.SpringTestController * {params,returnObj} -x 4

在这里插入图片描述

5.Arthas在线调试案例实战

  • 生产环境运行了java程序,需要在线调试,在不重启JVM程序,动态调整,打印参数或修改方法内部逻辑。
  • 步骤以及环境准备

在这里插入图片描述

  • 第一步:jad 把字节码文件反编译成源代码

在这里插入图片描述

在这里插入图片描述

  • 第二步:mc 在内存中把源代码编译成字节码文件

在这里插入图片描述

在这里插入图片描述

  • 第三步:redefine 把新生成的字节码文件在内存中执行

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

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

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

相关文章

国考省考行测:数字推理题2

国考省考行测:数字推理题2 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 …

改进YOLOv8 | 特征融合篇 | YOLOv8 应用 BiFPN 结构 | 《 EfficientDet: 可扩展和高效的目标检测》

模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了目标检测中的神经网络架构设计选择,并提出了几种关键的优化方法来提高效率。首先,我们提出了一种加权双向特征金字塔网络(BiFPN),它可以实现简单快速的多尺度特征融合;其次,我们提出了一种复合缩放方法…

从期望最大化(EM)到变分自编码器(VAE)

本文主要记录了自己对变分自编码器论文的理解。 Kingma D P, Welling M. Auto-encoding variational bayes[J]. arXiv preprint arXiv:1312.6114, 2013. https://arxiv.org/abs/1312.6114 1 带有潜在变量的极大似然估计 假设我们有一个有限整数随机数发生器 z ∼ p θ ( z ) …

Linux | 学习笔记(适合小白)上

操作系统概述: 计算机是由硬件和软件这两个主要部分组成的操作系统是软件的一类,主要作用是协助用户调度硬件工作,充当用户和计算机硬件之间的桥梁常见的操作系统:PC端:Windows,Linux,MacOS&…

电子邮件市场中,如何使用您的Gmail?

Gmail凭借其直观的界面、慷慨的免费存储空间(与其他Google工具共享15 GB,如Google Drive和Photos)以及作为常规Gmail账户附加的各种免费生产力工具,在电子邮件市场占据主导地位。但是,人们对Google如何使用您的电子邮件…

决策引擎平台建设方案

文档修订历史 时间版本主要内容2023.05.12v1.0.0初始化 1. 概述 1.1 需求 1.1.1 需求背景 当同一个业务场景中,有非常多的业务分支后,需要有非常多的 if 判断,来承载这些简单的业务逻辑,但随着业务的发展,业务逐渐…

Java --- redis7之大数据统计之Bitmap

目录 一、大数据统计之Bitmap 1.1、面试题 1.2、京东签到领取京豆 一、大数据统计之Bitmap 1.1、面试题 1、日活统计 2、签到打卡 3、最近一周的活跃用户等 1.2、京东签到领取京豆 一个月的签到天数,连续签到数 方案1:使用MySQL来实现(小项目) …

NTLM 中继攻击的几种非主流玩法

在企业组织中的常见的一种安全风险是凭证重用,当攻击者攻击 NT LAN Manager 身份验证协议(以下简称 NTLM 身份验证)时就会出现这样的风险,而这个协议通常会在 微软的 活动目录 中默认启用。 NTLM 认证中的不安全性已经被安全研究人员发现超过15年了。该…

使用Vue CLI脚手架

章节概述: 使用Vue CLI脚手架初始化脚手架分析脚手架结构render函数修改默认配置ref属性props配置项mixin混入plugin插件scoped样式Todo-List案例WebStorage自定义事件绑定解绑全局事件总线消息的订阅与发布$nextTick过渡与动画 提示(我没有使用markdo…

c++ 常用总结(二)

1. ① 可变参数... 、__VA_ARGS__与##__VA_ARGS__ 结论:##__VA_ARGS__中##的作用就是去掉前面多余的,号 ,在使用自定义打印的时候,推荐##__VA_ARGS__而不是__VA_ARGS__ C语言##__VA_ARGS__的用法_fengwang0301的博客-CSDN博客 例1 __VA…

良心推荐!数学建模基础知识-MATLAB快速上手,最适合新手学习的Matlab快速入门教程

目录 1. 如何打开matlab的文件 第一种方法: 第二种创建脚本文件的方法。 2. 如何运行一段代码 写在命令行 写在脚本 3.some tips about matlab 工作区储存的数据 如何加入断点&如何终止运行&代码分节 1. 如何打开matlab的文件 我们写的源代码可以…

探索对抗样本生成方法:保护机器学习模型的安全性

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Comparable和Comparator的用法和区别

文章目录 前言 在这里给大家整理了一下comparable和comparator的用法和区别,这些在以后代码和面试中可能也会出现,那么,就跟着我一起去看看吧! 一 .Comparable 1.Comparable是什么? public interface Comparable<T> comparable是个接口,此接口强行对实现它的每个类的对…

22 memcpy 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的拷贝 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 memcpy,…

【Linux】10. 进程地址空间

1. 虚拟地址的引出 2. 感性理解 3. 区域划分 在理解虚拟地址空间之前首先了解区域划分是什么 在小学期间的三八线&#xff0c;让桌子分割成两个区域&#xff0c;类比到地址空间也是这样划分的。 操作系统需要对进程管理&#xff0c;进程存在不同的区域映射不同的虚拟地址 这…

【GAMES101】作业0学习总结

本系列博客为记录笔者在学习GAMES101课程时遇到的问题与思考。 GAMES101&#xff1a;课程官网GAMES101&#xff1a;B站视频GAMES101&#xff1a;相关文件下载(百度网盘) 一、环境搭建 以下说明两种环境搭建方法&#xff0c;一种为用原视频所提及的VirtualBox一键搭建环境&…

随笔-涨薪了

突然想起来上个月工资&#xff0c;绩效部分是按照1.01发的&#xff0c;多了10块钱&#xff0c;这也是一年半来第一次涨薪了&#xff0c;就去小龙、小虎我仨的小群里面嘚瑟一下&#xff1a; 我&#xff1a;两年来第一次涨薪&#xff0c;涨了12。 小龙&#xff1a;羡慕。 小虎…

11-CSS-概述、与HTML的结合方式

一、概述 CSS&#xff08;层叠样式表&#xff09;是一种用于控制网页外观和布局的样式语言。它可以独立于 HTML 或 XHTML 文档&#xff0c;以及任何标记语言使用&#xff0c;因此可以用于设计不同类型的文档&#xff0c;如 XML、SVG、XUL 等。CSS 提供了广泛的样式选择器&…

6.Java流在Android中的应用

字节流有哪些? 以输出流为例,输入流除PrintStream外,和输出流是一一对应的 OutputStream ByteArrayOutputStreamPipedOutputStreamFilterOutputStream BufferedOutputStreamDataOutputStreamPrintStream FileOutputStreamObjectOutputStream 使用案例 DataOutputStream dos…

生信刷题之ROSALIND——Part 5 (PERM, PRTM, REVP)

公众号搜索《生信er》&#xff0c;内容更多&#xff0c;更精彩~ 目录 公众号搜索《生信er》&#xff0c;内容更多&#xff0c;更精彩~1、Enumerating Gene OrdersProblemSample DatasetSample OutputexampleCodeOutput 2、Calculating Protein MassProblemSample DatasetSample…