Arthas 初探--安装初步适用
作者 | agmtopy
由于在项目中遇到一种情况,某段代码在进行单元测试和在 tomcat 容器中运行的性能相差数百倍,因此需要分析在不同环境下某个方法执行的具体时间,从而确定问题。Arthas 可以做到无侵入的监控应用远行情况。
安装:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
linux 下直接执行,window 下载文件后执行。

执行完成后,显示当前 path 中指定的 JDK 中正在运行的 java 进程输入相应序号,进入 sh 命令,表示已连接成功。

初步使用
Arthas 命令初步使用,大概分为 5 类:
基础命令
- help——查看命令帮助信息
- cat——打印文件内容,和 linux 里的 cat 命令类似
- pwd——返回当前的工作目录,和 linux 命令类似
- cls——清空当前屏幕区域
- session——查看当前会话的信息
- reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- version——输出当前目标 Java 进程所加载的 Arthas 版本号
- history——打印命令历史
- quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
- keymap——Arthas快捷键列表及自定义快捷键
jvm相关
- dashboard——当前系统的实时数据面板
- thread——查看当前 JVM 的线程堆栈信息
- jvm——查看当前 JVM 的信息
- sysprop——查看和修改 JVM 的系统属性
- sysenv——查看 JVM 的环境变量
- getstatic——查看类的静态属性
- New! ognl——执行 ognl 表达式
- New! mbean——查看 Mbean 的信息
class/classloader相关
- sc——查看 JVM 已加载的类信息
- sm——查看已加载类的方法信息
- jad——反编译指定已加载类的源码
- mc——内存编绎器,内存编绎 .java 文件为 .class 文件
- redefine——加载外部的 .class 文件,redefine 到 JVM 里
- dump——dump 已加载类的 byte code 到特定目录
- classloader——查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
monitor/watch/trace 相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。
- monitor——方法执行监控
- watch——方法执行数据观测
- trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
- stack——输出当前方法被调用的调用路径
- tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
options
- options——查看或设置 Arthas 全局开关
使用实列
- trace 分析每个方法的具体执行时间

通过图示表明调用 MongoTemplate.executeFindMultiInternal() 方法时,最耗时的方法是在 doWith() 方法,总共执行 10000 次,耗时 ==252.3064ms==,最少一次调用耗时 ==0.0132ms==,最大一次耗时 ==38.4329ms==,分析原因还是在于数据量太大,MongoTemplate 通过循环遍历出结果在进行序列化。
- jad 反编译代码工具
jad com.sankuai.inf.leaf.common.ZeroIDGen

- watch 查看输入参数与输出参数
watch com.sankuai.inf.leaf.server.service.SegmentService getId '{params, target, returnObj}' -x 2
params 表示入参,target 表示当前的类,returnObj 表示返回值。

- stack 查看被调用的路径(向上)
stack com.sankuai.inf.leaf.server.service.SegmentService getId

- sc 查看 JVM 已加载的类信息
sc -d com.sankuai.inf.leaf.server.service.SegmentService getId

- thread 分析死锁
thread b


可以看出当前线程正在等待 ReentrantLock$NonfairSync@118f1fb4,而持有这个对象的线程又在等待当前线程释放,从而形成死锁!
- thread 分析 CPU 占用

总结
先放一张官方的总结大图:

总结:Arthas 是一个很优秀的 java 诊断工具,无论是安装还是使用都很简洁,并且使用文档全面、清晰明了,值得好好研究一番。
原文链接
本文为阿里云原创内容,未经允许不得转载。
Arthas 初探--安装初步适用的更多相关文章
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- RabbitMq初探——安装
rabbitmq Server安装 rabbitmq server安装很简单. 安装erlang环境 rpm -ihv erlang-18.1-1.el6.x86_64.rpm rpm -ihv ra ...
- Unity3D游戏开发初探—3.初步了解U3D物理引擎
一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...
- cnetos6.4 x64 阿里云环境初探--安装pip,及pymysql
由于以前帮朋友买过阿里云服务器,一直以为,不能再体验新用户免费了,由于最近比较有心情研究python,linux,就报着侥幸的心理,重新注册一个帐号试一下,注册完之后,惊奇的发现,原来阿里只要是新注册 ...
- Visual Studio 2017 RC 初探安装
上次看到博客介绍 Visual Studio 2017 RC,看到其中一个改进是启动很快,这是一大进步,也是低配电脑的程序员的期望.不过还没体验,是驴是骡子拉出来看看,这不就开始下载. 1.打开官网: ...
- zanphp 初探----安装篇
安装 zanphp 的安装详细步骤具体在 http://zanphpdoc.zanphp.io/,但是安装的时候,还是踩了一些坑,Mac 和 Ubuntu 我都安装过, 分享大家注意一下. PHP 版 ...
- Linux centos nginx下载安装初步
下载源码包解压编译 1.下载 # wget http://nginx.org/download/nginx-1.9.9.tar.gz 2.解压 # tar xvf nginx-1.9.9.tar.gz ...
- FreeMarker初探--安装FreeMarker
这里安装FreeMarker相当简单,不需要真正的安装过程.仅仅是拷贝 lib/freemarker.jar 到你 Java 应用程序的路径中,让类加载器可以发现它.比如,如果你在 Web 使用了 F ...
- 百度BAE环境下WordPress安装教程
不了解代码的童鞋慎重使用这种方法哦,安装过程中可能会出现一些简单的错误. 前两天有位网友在QQ上联系我,他告诉我自己在百度BAE上安装WordPress程序总是出错.我让他按照网络上的教程逐步安装,但 ...
- 在Fedora8上安装jdk-7u25-linux-i586.rpm的步骤
按:我们身处一个信息爆炸的年代,当有事不决时,打开搜索引擎瞬息间就能得到海量的答案.但是,这未必会让你的问题迎刃而解,因此很多“答案”会把你引向错误的方向,浪费你的时间.希望搜索引擎能有所改进,对明确 ...
随机推荐
- Djaong 运行报错:ValueError: Unable to configure handler 'default'
一.前提条件 1.Django 项目接入了 log 日志模块 二.解决方案 启动项目或者项目运行中,遇到如下报错 File "C:\Python38\lib\logging\config.p ...
- 使用maven命令安装Oracle的jar包到本地仓库
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.4 -Dpackaging=jar ...
- KingbaseES V8R6 集群环境备库不结束旧事务快照将影响主库的vacuum操作
前言 昨天同事遇到了一个有关vacuum的典型问题. V8R6读写分离集群环境,一主多备. 版本:kingbaseesv008r006c004 问题现象: 主库日常巡检发现日志大量记录: waring ...
- C++ 中的 volatile 和 atomic
C++ 中的 volatile 和 atomic 0. TL;DR std::atomic 用于多线程并发场景,有两个典型使用场景: 原子操作:对 atomic 变量的操作(读/写/自增/自减)仿佛受 ...
- MySQL登录退出与导入导出
登录退出MySQL 登录命令 mysql -u 用户名 -p 密码 -h IP -P 端口 mysql -u root -p password -h 127.0.0.1 -P 3306 一般登录命令 ...
- 16 JavaScript逗号运算符
16 JavaScript逗号运算符 Python 逗号运算符一般用于组合多个表达式,其返回值是最后一个表达式的值,例如: function s(){ console.log(1), console. ...
- 李俊刚:我是如何在OpenHarmony完成ap6275s WiFi驱动的HDF适配工作的?
编者按:在 OpenHarmony 生态发展过程中,涌现了大批优秀的代码贡献者,本专题旨在表彰贡献.分享经验,文中内容来自嘉宾访谈,不代表 OpenHarmony 工作委员会观点. 李俊刚 深圳开鸿数 ...
- CircleIndicator组件,使指示器风格更加多样化
UI界面是应用程序可视化必不可少的部分.设计精致的UI界面可以使得整个可视化应用程序给用户留下深刻的印象,是改善用户界面体验最直接的方式. ArkUI开发框架为开发者提供了丰富的UI原生组件,如Nav ...
- C 语言数组教程:定义、访问、修改、循环遍历及多维数组解析
C 数组 数组用于将多个值存储在单个变量中,而不是为每个值声明单独的变量. 要创建数组,请定义数据类型(例如 int)并指定数组名称,后面跟着方括号 []. 要将值插入其中,请使用逗号分隔的列表,并在 ...
- Qt线程简单使用一:QThread~创建线程类子类
需求: 点击QPushButton按钮,QLabel中的数字,不断累加,一直到999. 做法: 点击QPushButton后,启动线程,线程while循环,不断发送累加的数字回主线程,修改QL ...