jvm调优神器arthas(阿尔萨斯)安装与调优介绍

jvm调优神器arthas(阿尔萨斯)安装与调优介绍1arthas 阿尔萨斯 安装 arthas 官网链接 官网链接 安装方式分为两种 1 自动安装步骤 1 1 快速安装 使用 arthas boot 推荐 第 1 步 curl O https alibaba github io arthas arthas boot jar 第 2 步 java jar

大家好,我是讯享网,很高兴认识大家。

1arthas(阿尔萨斯)安装

arthas官网链接:官网链接
安装方式分为两种
1).自动安装步骤
1.1快速安装
使用arthas-boot(推荐)

1步 curl -O https://alibaba.github.io/arthas/arthas-boot.jar 第2步 java -jar arthas-boot.jar 

讯享网

注,如果没有java程序,运行第二步会报错,需要启动一个java进程;
启动后退出 按Q就退出了
1.2使用as.sh
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 回车 执行即可:

讯享网curl -L https://alibaba.github.io/arthas/install.sh | sh 

2.手动安装步骤
手动安装Arthas
下载最新版本

最新版本,点击下载:https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square

如果下载速度比较慢,可以尝试用阿里云的镜像仓库,比如要下载3.x.x版本(替换3.x.x为最新版本),下载的url是:

https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.x.x/arthas-packaging-3.x.x-bin.zip 

解压缩arthas的压缩包

讯享网unzip arthas-packaging-bin.zip 

安装Arthas

安装之前最好把所有老版本的Arthas全都删掉

sudo su admin rm -rf /home/admin/.arthas/lib/* cd arthas ./install-local.sh 

注意,这里根据你需要诊断的Java进程的所属用户进行切换

启动Arthas

启动之前,请确保老版本的Arthas已经stop.

讯享网./as.sh 

2alsace调优介绍

  1. 启动Demo
curl -O https://alibaba.github.io/arthas/arthas-demo.jar java -jar arthas-demo.jar 

arthas-demo是一个简单的程序,每隔一秒生成一个随机数,再执行质因数分解,并打印出分解结果。

arthas-demo源代码:查看

  1. 启动arthas
    在命令行下面执行(使用和目标进程一致的用户启动,否则可能attach失败):
讯享网curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar 

执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。

如果attach不上目标进程,可以查看~/logs/arthas/ 目录下的日志。

如果下载速度比较慢,可以使用aliyun的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http

java -jar arthas-boot.jar -h 打印更多参数信息。

选择应用java进程:

$ $ java -jar arthas-boot.jar * [1]: 35542 [2]: 71560 arthas-demo.jar 

Demo进程是第2个,则输入2,再输入回车/enter。Arthas会attach到目标进程上,并输出日志:

讯享网[INFO] Try to attach process 71560 [INFO] Attach process 71560 success. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki: https://alibaba.github.io/arthas version: 3.0.5.536 pid: 71560 time: 2018-11-28 19:16:24 

$
3. 查看dashboard
输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

$ dashboard ID NAME GROUP PRIORI STATE %CPU TIME INTERRU DAEMON 17 pool-2-thread-1 system 5 WAITIN 67 0:0 false false 27 Timer-for-arthas-dashb system 10 RUNNAB 32 0:0 false true 11 AsyncAppender-Worker-a system 9 WAITIN 0 0:0 false true 9 Attach Listener system 9 RUNNAB 0 0:0 false true 3 Finalizer system 8 WAITIN 0 0:0 false true 2 Reference Handler system 10 WAITIN 0 0:0 false true 4 Signal Dispatcher system 9 RUNNAB 0 0:0 false true 26 as-command-execute-dae system 10 TIMED_ 0 0:0 false true 13 job-timeout system 9 TIMED_ 0 0:0 false true 1 main main 5 TIMED_ 0 0:0 false false 14 nioEventLoopGroup-2-1 system 10 RUNNAB 0 0:0 false false 18 nioEventLoopGroup-2-2 system 10 RUNNAB 0 0:0 false false 23 nioEventLoopGroup-2-3 system 10 RUNNAB 0 0:0 false false 15 nioEventLoopGroup-3-1 system 10 RUNNAB 0 0:0 false false Memory used total max usage GC heap 32M 155M 1820M 1.77% gc.ps_scavenge.count 4 ps_eden_space 14M 65M 672M 2.21% gc.ps_scavenge.time(m 166 ps_survivor_space 4M 5M 5M s) ps_old_gen 12M 85M 1365M 0.91% gc.ps_marksweep.count 0 nonheap 20M 23M -1 gc.ps_marksweep.time( 0 code_cache 3M 5M 240M 1.32% ms) Runtime os.name Mac OS X os.version 10.13.4 java.version 1.8.0_162 java.home /Library/Java/JavaVir tualMachines/jdk1.8.0 _162.jdk/Contents/Hom e/jre 

dashboard命令示意图
讯享网

  1. 通过thread(线程相关)命令来获取到arthas-demo进程的Main Class
    只输入 thread 会输出当前进程的所有线程
    thread 1会打印线程ID 1的栈,通常是main函数的线程。

thread的参数: -n N(数量) 表示 指定最忙的前N个线程并打印堆栈
-b 找出当前阻塞其他线程的线程
i 指定cpu占比统计的采样间隔,单位为毫秒
查看某状态的线程 thread --state 状态 等待状态的 thread --state WAITING

讯享网$ thread 1 | grep 'main(' at demo.MathGame.main(MathGame.java:17) 
$ thread 1 'main(' at demo.MathGame.main(MathGame.java:17) 
  1. 通过jad来反编译Main Class
讯享网$ jad demo.MathGame 
$ jad demo.MathGame ClassLoader: +-sun.misc.Launcher$AppClassLoader@3d4eac69 +-sun.misc.Launcher$ExtClassLoader@66350f69 Location: /tmp/arthas-demo.jar /* * Decompiled with CFR 0_132. */ package demo; import java.io.PrintStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; public class MathGame { 
    private static Random random = new Random(); private int illegalArgumentCount = 0; public static void main(String[] args) throws InterruptedException { 
    MathGame game = new MathGame(); do { 
    game.run(); TimeUnit.SECONDS.sleep(1L); } while (true); } public void run() throws InterruptedException { 
    try { 
    int number = random.nextInt(); List<Integer> primeFactors = this.primeFactors(number); MathGame.print(number, primeFactors); } catch (Exception e) { 
    System.out.println(String.format("illegalArgumentCount:%3d, ", this.illegalArgumentCount) + e.getMessage()); } } public static void print(int number, List<Integer> primeFactors) { 
    StringBuffer sb = new StringBuffer("" + number + "="); Iterator<Integer> iterator = primeFactors.iterator(); while (iterator.hasNext()) { 
    int factor = iterator.next(); sb.append(factor).append('*'); } if (sb.charAt(sb.length() - 1) == '*') { 
    sb.deleteCharAt(sb.length() - 1); } System.out.println(sb); } public List<Integer> primeFactors(int number) { 
    if (number < 2) { 
    ++this.illegalArgumentCount; throw new IllegalArgumentException("number is: " + number + ", need >= 2"); } ArrayList<Integer> result = new ArrayList<Integer>(); int i = 2; while (i <= number) { 
    if (number % i == 0) { 
    result.add(i); number /= i; i = 2; continue; } ++i; } return result; } } Affect(row-cnt:1) cost in 970 ms. 
  1. watch 监视
讯享网通过watch命令来查看demo.MathGame#primeFactors函数的返回值: 
$ watch demo.MathGame primeFactors returnObj Press Ctrl+C to abort. Affect(class-cnt:1 , method-cnt:1) cost in 107 ms. ts=2018-11-28 19:22:30; [cost=1.ms] result=null ts=2018-11-28 19:22:31; [cost=0.ms] result=null ts=2018-11-28 19:22:32; [cost=19.012416ms] result=@ArrayList[ @Integer[5], @Integer[47], @Integer[], ] ts=2018-11-28 19:22:33; [cost=0.ms] result=@ArrayList[ @Integer[2], @Integer[5], @Integer[317], @Integer[503], @Integer[887], ] ts=2018-11-28 19:22:34; [cost=10.ms] result=@ArrayList[ @Integer[2], @Integer[2], @Integer[3], @Integer[3], @Integer[31], @Integer[], ] ts=2018-11-28 19:22:35; [cost=29.ms] result=@ArrayList[ @Integer[5], @Integer[29], @Integer[], ] 

更多的功能可以查看进阶使用。

  1. 退出arthas
    如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行stop命令。

  1. 基础命令

help——查看命令帮助信息

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

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

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

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

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

cls——清空当前屏幕区域

session——查看当前会话的信息

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

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

history——打印命令历史

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

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

keymap——Arthas快捷键列表及自定义快捷键

jvm相关

dashboard——当前系统的实时数据面板

thread——查看当前 JVM 的线程堆栈信息
thread的参数: -n N(数量) 表示 指定最忙的前N个线程并打印堆栈
b 找出当前阻塞其他线程的线程
i 指定cpu占比统计的采样间隔,单位为毫秒
jvm——查看当前 JVM 的信息

sysprop——查看和修改JVM的系统属性

sysenv——查看JVM的环境变量

vmoption——查看和修改JVM里诊断相关的option

perfcounter——查看当前 JVM 的Perf Counter信息

logger——查看和修改logger

getstatic——查看类的静态属性

ognl——执行ognl表达式

mbean——查看 Mbean 的信息

heapdump——dump java heap, 类似jmap命令的heap dump功能

class/classloader相关

sc(Search-Class)——查看JVM已加载的类信息Search-Class

sm(Search-Method)——查看已加载类的方法信息

jad——反编译指定已加载类的源码

mc——内存编译器,内存编译.java文件为.class文件

redefine——加载外部的.class文件,redefine到JVM里

dump——dump 已加载类的 byte code 到特定目录

classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

monitor——方法执行监控

watch——方法执行数据观测

trace——方法内部调用路径,并输出方法路径上的每个节点上耗时

stack——输出当前方法被调用的调用路径

tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

profiler/火焰图 profiler–使用async-profiler对应用采样,生成火焰图

options options——查看或设置Arthas全局开关

管道 Arthas支持使用管道对上述命令的结果进行进一步的处理,如sm java.lang.String * | grep ‘index’

grep——搜索满足条件的结果

plaintext——将命令的结果去除ANSI颜色

wc——按行统计输出结果

后台异步任务 当线上出现偶发的问题,比如需要watch某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了,详情请参考这里

使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session断开不影响任务执行(生命周期默认为1天)

jobs——列出所有job

kill——强制终止任务

fg——将暂停的任务拉到前台执行

bg——将暂停的任务放到后台执行

Web Console 通过websocket连接Arthas。

在tunnel server里有一个示例的回报代码,用户可以自己在服务器上实现。

StatController.java

官方命令列表地址添加链接描述

6远程连接alsace

小讯
上一篇 2025-03-28 07:57
下一篇 2025-03-02 14:03

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/21508.html