【Java知识】java进阶-一个好用的java应用分析工具arthas

文章目录

    • 概述
      • 主要功能
      • 使用方法
        • 安装和启动 Arthas
        • 使用 Arthas 命令
          • 1. dashboard
          • 2. thread
          • 3. sc (Search Class)
          • 4. jad (Java Assembly Disassemble)
          • 5. monitor
          • 6. watch
          • 7. trace
          • 8. 退出 Arthas
    • 🔍 Arthas 如何帮助定位内存泄漏问题?
      • 1. 监控整体内存状况
      • 2. 生成堆转储文件
      • 3. 分析堆转储文件
      • 4. 使用 `--live` 标志精确定位
      • 5. 监控 profiler 自身内存占用
    • 📊 如何解读Arthas生成的内存使用报告?
      • 1. 使用`memory`命令查看内存状态
      • 2. 分析`heapdump`生成的堆转储文件
      • 3. 使用MAT工具分析堆转储文件
      • 4. 使用`dashboard`命令查看实时数据面板
      • 5. 使用`histogram`命令查看对象分布
    • 使用Arthas诊断并定位CPU异常占用问题
      • 第一步:确保Arthas环境准备就绪
      • 第二步:排除GC影响
      • 第三步:定位高CPU消耗的线程
      • 第四步:深入分析高CPU消耗线程
      • 第五步:使用其他Arthas命令进一步诊断

概述

Arthas 是由阿里巴巴开源的一款功能强大的 Java 诊断工具,它可以帮助开发者在不修改代码、不重启应用程序的前提下,对线上问题进行快速诊断和定位。以下是 Arthas 的一些主要功能、使用方法以及对应的命令行详解:

主要功能

  1. Dashboard:实时查看 Java 服务的运行状况,包括线程、内存、GC 等信息。
  2. 查看入参/返回值/异常:实时查看方法调用的入参、返回值、异常。
  3. 在线热更新:通过 jadscredefine 等命令实现代码热更新。
  4. 类冲突:秒解类冲突问题,定位类加载路径。
  5. 性能热点:快速定位应用的热点,生成火焰图。
  6. Webconsole:在线诊断,点开网页及时诊断线上应用。

使用方法

Arthas 是由阿里巴巴开源的一款强大的 Java 诊断工具,它可以帮助开发者在不修改代码、不重启应用的情况下,对线上问题进行快速诊断和定位。以下是 Arthas 的使用方法和一些常用命令的详解:

安装和启动 Arthas
  1. 下载 Arthas
    你可以通过以下命令下载 Arthas 的启动器 arthas-boot.jar
    curl -O https://arthas.aliyun.com/arthas-boot.jar
    
  2. 启动 Arthas
    使用以下命令启动 Arthas,并选择需要诊断的目标 Java 进程:
    java -jar arthas-boot.jar
    
    启动后,Arthas 会列出所有 Java 进程,你可以选择需要诊断的进程编号进行连接。
使用 Arthas 命令

以下是Arthas的一些常见命令及其参数使用详解:

1. dashboard
  • 用途:展示当前系统的实时数据面板。
  • 命令
    dashboard
    
  • 参数
    • -i <interval>:设置刷新时间间隔,默认5000ms。
    • -n <number>:设置刷新次数。
  • 详解dashboard 命令可以展示JVM的实时数据,包括线程、内存、GC等信息。可以通过参数-i-n来调整刷新频率和次数。
2. thread
  • 用途:查看当前JVM的线程堆栈信息。
  • 命令
    thread
    
  • 参数
    • id:查看指定线程的堆栈信息。
    • -n <number>:展示最忙的前N个线程并打印堆栈信息。
    • -b:找出被synchronized关键字阻塞住的线程。
  • 详解thread 命令可以查看所有线程的信息,或者通过参数-n查看最忙的线程,或者通过-b找出被阻塞的线程。
3. sc (Search Class)
  • 用途:查找JVM中已加载的类信息。
  • 命令
    sc -d *MathGame
    
  • 参数
    • -d:展示类的详细信息。
    • -E:开启正则表达式匹配,默认为通配符匹配。
  • 详解sc 命令用于查找匹配特定模式的类,并可以展示类的详细信息。
4. jad (Java Assembly Disassemble)
  • 用途:反编译指定的类或方法。
  • 命令
    jad demo.MathGame
    
  • 参数
    • -c::指定类加载器的hashcode。
    • -E:开启正则表达式匹配,默认为通配符匹配。
  • 详解jad 命令可以将JVM中实际运行的class的byte code反编译成java代码,便于理解业务逻辑。
5. monitor
  • 用途:方法执行监控。
  • 命令
    monitor -c 120 *MathGame primeFactors
    
  • 参数
    • -c <seconds>:设置统计周期,默认值为120秒。
    • -E:开启正则表达式匹配,默认为通配符匹配。
  • 详解monitor 命令用于监控匹配特定类和方法的调用情况,包括调用次数、成功次数、失败次数等。
6. watch
  • 用途:方法执行数据观测。
  • 命令
    watch demo.MathGame primeFactors returnObj
    
  • 参数
    • -x <level>:设置对象展开的层级,默认为1。
    • -E:开启正则表达式匹配,默认为通配符匹配。
  • 详解watch 命令用于观察方法的参数、返回值和异常信息,通过编写OGNL表达式进行对应变量的查看。
7. trace
  • 用途:统计方法的调用链路,并输出每个节点的耗时。
  • 命令
    trace *MathGame run
    
  • 参数
    • -E:开启正则表达式匹配,默认为通配符匹配。
  • 详解trace 命令用于追踪方法的执行路径和性能开销,对于性能分析非常有用。

这些命令覆盖了从JVM监控、类加载信息查询到性能分析等多个方面,是Arthas工具的常用功能。通过这些命令,你可以有效地诊断和解决Java应用中的问题。

8. 退出 Arthas
  • 如果只是退出当前的连接,可以用 quit 或者 exit 命令。
  • 如果想完全退出 Arthas,可以执行 stop 命令。

通过这些命令,你可以使用 Arthas 来监控和诊断 Java 应用的各种问题,包括性能瓶颈、死锁、内存泄漏等。Arthas 提供了一种强大的方式来诊断和监控 Java 应用,使得开发者能够快速定位和解决线上问题。

🔍 Arthas 如何帮助定位内存泄漏问题?

Arthas 是一个强大的 Java 诊断工具,它可以帮助我们定位内存泄漏问题。以下是使用 Arthas 定位内存泄漏问题的主要步骤和对应的命令行详解:

1. 监控整体内存状况

首先,使用 memory 命令定期检查 JVM 的内存状态,以识别是否有内存泄漏的迹象。关注 heap、特别是 g1_old_gen 区域的使用率与增长趋势,因为这是大部分对象最终驻留的地方。如果发现某一块内存持续增长而不减少,这可能是内存泄漏的信号。

memory

这个命令会提供各个内存区域(如堆、非堆、G1区域等)的使用情况。

2. 生成堆转储文件

当怀疑存在内存泄漏时,使用 heapdump 命令创建堆转储文件,比如 heapdump /path/to/dump.hprof。这会保存当前 JVM 堆内存的状态到一个文件中,便于后续分析。

heapdump /path/to/dump.hprof

这个命令会创建一个堆内存快照文件,之后可以使用 Eclipse Memory Analyzer (MAT) 等工具分析这个文件,查找内存泄漏的具体对象及其引用链路。

3. 分析堆转储文件

利用诸如 Eclipse Memory Analyzer (MAT) 等工具打开之前生成的堆转储文件,分析其中的对象数量、大小及引用链路。重点关注那些数量异常增多或单个对象占用内存过大的实例,这些往往是内存泄漏的源头。

4. 使用 --live 标志精确定位

在进行内存分析时,可以利用 profiler start --live 命令,确保只保留未被垃圾回收的对象。这有助于更精确地识别真正泄漏的对象,排除掉正常生命周期内会被清理的对象干扰。

5. 监控 profiler 自身内存占用

虽然不是直接排查应用内存泄漏的步骤,但通过 profiler meminfo 命令监控 Arthas Profiler 自身的内存使用情况,可以确保分析过程中 Profiler 本身对 JVM 的影响降到最低,避免误解分析结果。

通过以上步骤,结合 Arthas 提供的命令和外部分析工具,可以有效地定位并诊断项目中的内存泄漏问题或识别出占用内存过大的对象。记得每次操作后都要分析数据变化,对比不同时间点的结果,以便追踪问题的发展和定位确切的泄露源。

📊 如何解读Arthas生成的内存使用报告?

要解读Arthas生成的内存使用报告,我们可以遵循以下步骤和方法:

1. 使用memory命令查看内存状态

memory命令提供了当前JVM的内存使用情况,包括堆内存、非堆内存以及各细分区域的使用详情。这个命令对于识别内存是否泄漏及大致位置至关重要。

  • 观察堆内存(heap):特别是老年代(g1_old_gen)的增长情况,因为长期存活的对象通常在此积累。
  • 注意非堆内存(nonheap):特别是元空间(metaspace)的增长,过大的类元数据可能导致问题。
  • 检查代码缓存(codeheap):是否有异常增长,这可能意味着即时编译的代码占用过多内存。

2. 分析heapdump生成的堆转储文件

如果memory命令显示内存有异常增长的趋势,可以使用heapdump命令生成堆的快照,以便进行深入分析。

  • 生成堆转储文件
    heapdump arthas-output/dump.hprof
    
    这个命令会创建一个堆内存快照文件,之后可以使用Eclipse Memory Analyzer (MAT)等工具分析这个文件,查找内存泄漏的具体对象及其引用链路。

3. 使用MAT工具分析堆转储文件

在MAT中,关注那些占用内存大且数量异常增多的对象。这些通常是内存泄漏的源头。通过分析这些对象的引用链,可以追溯到导致泄漏的代码位置,从而为解决问题提供线索。

4. 使用dashboard命令查看实时数据面板

dashboard命令提供了一个实时的数据面板,显示当前系统的实时数据,包括线程、内存、GC等信息。

  • 实时监控内存使用情况:通过dashboard可以实时查看内存使用情况,特别是堆内存和非堆内存的变化。

5. 使用histogram命令查看对象分布

histogram命令可以展示当前JVM中对象的分布情况,按照类名和对象数量进行排序。这个命令可以帮助我们快速定位哪些对象占用了大量的内存,从而找到可能的内存泄露点。

  • 查看对象分布
    histogram -h 100
    
    这个命令会显示对象数量最多的前100个类的分布情况,帮助识别内存占用大的对象。

通过上述步骤,结合Arthas提供的实时监控与诊断能力,以及专业分析工具的深度分析能力,可以有效地解读Arthas生成的内存使用报告,并定位内存泄漏问题。

使用Arthas诊断并定位CPU异常占用问题

要使用Arthas诊断并定位CPU异常占用问题,可以按照以下步骤操作:

第一步:确保Arthas环境准备就绪

  1. 下载并启动Arthas
    curl -O https://arthas.aliyun.com/arthas-boot.jar
    java -jar arthas-boot.jar
    
    启动后,选择需要排查的JVM进程。

第二步:排除GC影响

  1. 运行 dashboard 命令
    dashboard 命令用于整体展示进程所有线程、内存、GC等情况。关注Memory相关的信息,检查内存使用情况(usage)是否已满以及GC(垃圾回收)频率是否过高。如果GC频繁,可能说明存在内存泄露或不当的内存使用模式导致CPU被频繁用于GC操作。

第三步:定位高CPU消耗的线程

  1. 运行 thread 命令
    使用 thread -n 8 命令来查看最繁忙的8个线程的堆栈信息。这些堆栈信息会展示线程当前主要停留在哪个方法上执行,从而帮助定位到CPU消耗较多的具体方法或代码块。

第四步:深入分析高CPU消耗线程

  1. 分析线程堆栈
    通过 thread 命令输出的结果,可以识别出哪些线程占据了较高的CPU资源,并思考这些线程与程序的哪部分逻辑相关联。

第五步:使用其他Arthas命令进一步诊断

  1. 使用 jadwatchognl 命令
    • jad 命令用于反编译类,查看具体的方法实现。
    • watch 命令用于观察方法的入参和返回值,以及方法执行时间,可以帮助识别慢方法的入参。
    • ognl 命令用于执行OGNL表达式,可以直接查询类的静态字段值。

通过上述步骤,结合Arthas提供的强大诊断功能,可以逐步缩小问题范围,最终定位到造成CPU占用过高的具体原因,并据此采取相应的优化措施。这些步骤依据于已知的知识内容,能够帮助你有效地使用Arthas工具来诊断和修复CPU异常占用问题。

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

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

相关文章

Vagrant使用教程:创建CentOS 8虚拟机

目录 简介准备工作下载配置Vagrant修改环境变量创建VAGRANT_HOME环境变量修改virturalBox新建虚拟机文件的默认生成路径修改Vagrant配置支持VirtualBox7.1.x版本创建Vagrant文件添加镜像 初始化并开机初始化开发环境开机 其他配置项宿主机的交换目录修改虚拟机内存修改 访问方式…

2024/11/4 数据结构大题打卡

邻接矩阵定义&#xff1a; typedef struct{char vex[N];int weight[N][N];int vexnum,arcnum; }MGraph; 邻接链表定义&#xff1a; #difine N 8typedef struct ArcNode{int vexIndex;int weight;struct ArcNode *next; }ArcNode; typedef struct VNode{char data;ArcNode *…

能详细的说明单片机的原理及其设计方法吗?如何快速的学会单片机这门技术?

单片机&#xff08;Microcontroller Unit&#xff0c;简称 MCU&#xff09;是一种将中央处理器&#xff08;CPU&#xff09;、存储器、输入输出接口等集成在一块芯片上的微型计算机系统。 **单片机的工作原理**&#xff1a; 单片机通过内部的时钟信号来同步各个部件的工作。程…

第一篇 硬件篇1[学习-来自 正点原子]

在电路设计中&#xff0c;TVS&#xff08;瞬态电压抑制器&#xff09;是一种有效的保护元件&#xff0c;可以用来防止瞬时过电压对芯片和其他敏感器件造成损坏。 STM32F103RCT6作为MCU 一键下载电路的具体实现过程&#xff1a; 首先&#xff0c; mcuisp控制 DTR输出低电平&…

最基础版编译运行Java(纯小白)

流程图&#xff1a; ⚠ 需要先安装JDK (Java Development Kit) 1. 写文件 首先写好自己的“文件”&#xff0c;可以用Sublime Text等文本编辑器写&#xff0c;还可以直接新建文本文档写一个.txt文件。 以编写一个HelloWorld程序为例&#xff1a; public class HelloWorld{p…

k8s 上如何跑 Dolphins 模型

接着上一篇的介绍&#xff0c;这一篇就来跑跑 Dolphins 模型&#xff0c;本篇会记录&#xff0c;跑模型常见的阬点。 1 在 k8s 上创建 pod 将外部数据挂载在 pod 里&#xff0c;并申请 gpu 资源。同时修改代码里对应的引入数据的路径 # dolphins.yaml apiVersion: v1 kind: …

大数据-206 数据挖掘 机器学习理论 - 多元线性回归 回归算法实现 算法评估指标

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【Effective C++】阅读笔记4

1. 确保公有继承中有is-a的关系 Is-a关系理解 该关系就是派生类应该具备基类的所有特性&#xff0c;并且可以替代基类对象使用&#xff0c;例如猫和狗都是动物的派生类&#xff0c;因为猫和狗都和动物形成了is-a关系&#xff0c;猫和狗都是动物。 在该关系下&#xff0c;派生类…

嵌入式实验2--数码管显示(基础+进阶)

一、数码管显示 0.想实现效果&#xff1a; 数码管交替或同时显示数字 1.电路设计 使用proteus 设计电路 1.1 STM32最小系统 搭建STM32工作基础条件 1.2 数码管电路 1.2.1 数码管 a.共阴极 abg dp都是led灯&#xff0c;这些led灯的公共端接地&#xff0c;就是共阴极&…

【LeetCode:633. 平方数之和 + 双指针】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

SpringCloud-Eureka注册中心

假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;order-service调用…

5. 推导仿真

5.1 DCDC电源(以buck电路为例)相关公式推导计算-电感 (1)计算电感的饱和电流和 电感的感值 三角号I:纹波电流 饱和电流:有条件

MySQL rand()函数、rand(n)、生成不重复随机数

文章目录 一、rand()与rand(n)二、rand()使用示例2.1、rand()与order by/group by使用随机排序分组2.2、round()与rand()的组合使用2.3、rand与ceiling的组合使用2.4、rand与floor组合使用2.5、rand与md5组合使用 三、总结3.1、rand()与rand(n)的区别 有时候我们想要生成一个唯…

告别局域网限制!轻松远程访问本地Paperless-ngx文档管理系统远程办公

前言&#xff1a;本文主要介绍如何在Linux系统本地Docker部署Paperless-ngx开源文档管理系统&#xff0c;并结合cpolar内网穿透工具解决本地部署后因为没有公网IP受到局域网访问限制&#xff0c;在异地也能随时远程访问的困扰。 Paperless-ngx是一个开源的文档管理系统&#x…

koa项目实战 == 实现注册登录鉴权

一. 项目的初始化 1 npm 初始化 npm init -y生成package.json文件: 记录项目的依赖 2 git 初始化 git init生成’.git’隐藏文件夹, git 的本地仓库 3 创建 ReadMe 文件 二. 搭建项目 1 安装 Koa 框架 npm install koa2 编写最基本的 app 创建src/main.js const Koa…

中烟创新:以AI审核平台助力烟草行业高效发展

企业对于高效、准确且标准化的文档审核流程需求日益迫切。传统的人工审核方式&#xff0c;不仅耗时费力&#xff0c;而且易受个人主观因素影响&#xff0c;导致审核标准难以统一&#xff0c;影响了工作效率与审核质量。北京中烟创新科技有限公司&#xff08;简称&#xff1a;“…

SpringBoot框架:作业管理技术新解

4 系统设计 4.1系统概要设计 作业管理系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

Chrome 插件怎么安装与下载?超详细

原文链接&#xff1a; https://www.chajianxw.com/tutorial/how-to-install-chrome-plugin.html 前言 国内因为无法访问 Chrome 应用商店的缘故&#xff0c;导致很多优秀的扩展程序无法正常下载与安装。本文将手把手教你如何通过离线安装Chrome 插件&#xff0c;全文图文讲解…

实现图书管理系统

1. 图书管理系统菜单 如上图给用户选项 1. 管理员 2. 普通用户 2. 实现基本框架 右键点src&#xff0c;选择new&#xff0c;选择Package命名三个包 book operation user 1.先选择book包&#xff0c;new两个类 book bookList 在book类中定义书的基本属性&#xff0c;并重写…

黑马官网最新2024前端就业课V8.5笔记---CSS篇(1)

Css 定义 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容) Css 引入方式 内部样式表&#xff1a; CSS 代码写在 style 标签里面 外部样式表: 开发使用 CSS 代码写在单独的 CSS 文件中(.css) 在 HTML 使用 link …