精华内容
下载资源
问答
  • arthas使用

    2019-11-04 18:11:36
    arthas使用 安装下载 基础命令 启动:安装文件夹下执行 wget https://alibaba.github.io/arthas/arthas-demo.jar java -jar arthas-demo.jar 容器环境下: pdb zhenai-profile-provider-b44dc9dc-pt2gs [外链...

    arthas使用

    安装下载

    基础命令
    • 启动:安装文件夹下执行
    wget https://alibaba.github.io/arthas/arthas-demo.jar
    java -jar arthas-demo.jar
    

    在这里插入图片描述

    • 查看dashboard:输入dashboard,会展示当前进程信息,按ctrl+c可中断执行
    ID             NAME                                        GROUP                        PRIORITY       STATE         %CPU           TIME           INTERRUPTED   DAEMON
    552            Timer-for-arthas-dashboard-8cbf395a-b670-4c system                       10             RUNNABLE      65             0:0            false         true
    176            sentinel-time-tick-thread                   main                         5              TIMED_WAITING 29             52:56          false         true
    186            DubboResponseTimeoutScanTimer               main                         5              TIMED_WAITING 2              3:10           false         true
    124            New I/O server boss #1 ([id: 0x1be37c6d, /0 main                         5              RUNNABLE      1              0:15           false         true
    33             Abandoned connection cleanup thread         main                         5              TIMED_WAITING 0              0:6            false         true
    509            AsyncAppender-Worker-arthas-cache.result.As system                       9              WAITING       0              0:0            false         true
    120            AsyncResolver-bootstrap-0                   main                         5              TIMED_WAITING 0              0:0            false         true
    237            AsyncResolver-bootstrap-executor-0          main                         5              WAITING       0              0:0            false         true
    507            Attach Listener                             system                       9              RUNNABLE      0              0:0            false         true
    107            ClientHouseKeepingService                   main                         5              TIMED_WAITING 0              0:9            false         true
    435            ClientHouseKeepingService                   main                         5              TIMED_WAITING 0              0:7            false         true
    29             Curator-ConnectionStateManager-0            main                         5              WAITING       0              0:0            false         true
    84             Curator-ConnectionStateManager-0            main                         5              WAITING       0              0:0            false         true
    32             Curator-Framework-0                         main                         5              WAITING       0              0:0            false         true
    87             Curator-Framework-0                         main                         5              WAITING       0              0:0            false         true
    67             Curator-TreeCache-0                         main                         5              WAITING       0              0:0            false         true
    Memory                                used        total        max         usage        GC
    heap                                  242M        583M         583M        41.52%       gc.parnew.count                             563
    par_eden_space                        161M        245M         245M        65.61%       gc.parnew.time(ms)                          3692
    par_survivor_space                    1M          30M          30M         5.06%        gc.concurrentmarksweep.count                3
    cms_old_gen                           79M         307M         307M        25.89%       gc.concurrentmarksweep.time(ms)             299
    nonheap                               179M        183M         744M        24.18%
    code_cache                            60M         61M          240M        25.14%
    metaspace                             107M        109M         256M        41.92%
    Runtime                                                                                 
    os.name                                     Linux
    os.version                                  3.10.0-862.9.1.el7.x86_64
    java.version                                1.8.0_191
    java.home                                   /usr/java/jdk1.8.0_191/jre
    systemload.average                          1.18
    processors                                  2
    uptime                                      430681s
    
    • 通过jad反编译class:
    jad com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    
    进阶命令
    class/classloader相关
    • sc-查看jvm已经加载的类信息:Search-Class简写,这个能搜索出所有已经加载到jvm的class,支持参数[d],[E],[f],[x:]
      • -d: 输出当前类的详细信息
      • -e: 开启正则表达式匹配,默认为通配符匹配
      • -f: 输 出当前类的成员变量信息,需要配合-d 一起使用
      • -x : 指定输出静态变量时属性的遍历深度,默认0
    //模糊搜索
    $ sc com.zhenai.profile.provider.modules.member.service.impl.*
    //输出类详细信息
    $ sc -d com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    //输出详细信息基础上加上fields信息
    sc -d -f com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    
    • sm-Search-Method简写,这个命令能搜索出已经加载的class信息的方法信息。参数如下
      • -d : 展示每个方法详细信息
      • -e : 开启正则默认通配符匹配
    //列出所有方法
    sm com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    //方法详细信息
    sm -d com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    
    • jad- 将jvm中实际运行的class的byte code反编译成java代码。
    //反编译类
    jad com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl
    //反编译指定函数
    jad  com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress
    
    • mc-Memory Compiler内存编译器,编译.java文件生成class文件
    mc /temp/test.java
    
    • monitor-方法执行监控,非实时返回命令,监控纬度如下:
      • timeStamp-时间戳
      • class-java类
      • method-方法
      • total-调用次数
      • success-成功次数
      • fail-失败次数
      • rt-评价rt
      • fail-tate - 失败率
    //监控getAddress方法,参数-c 统计周期,默认120秒,此处设置5秒
    monitor -c 5 com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress
    
    • watch- 方法执行数据观测,参数如下
      • -b: 方法调用之前观察
      • -e: 方法异常后观察
      • -s : 方法返回后观察
      • -f : 方法结束后(正常,异常返回)观察
      • -E: 开启正则
      • x: 指定输出结果的属性遍历深度
      • 这里重点要说明的是观察表达式,观察表达式的构成主要由 ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。
    //基础用法
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2
    //观察入参,会发现对比上一个返回值是null
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2 -b
    //同时观察方法调用前后, 参数里-n 2,表示只执行两次, 此处第一次输出是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, returnObj}" -x 2 -b -s -n 2
    //跳转-x值观察具体方法参数, -x表遍历深度,可以调整来打印具体的参数和结果内容
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params, target}" -x 2
    //筛选条件对参数筛选
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params[0],target}" "params[0]>0"
    //异常情况抛出
    watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress "{params[0],thromExp}" -e -x 2
     //耗时过滤
     watch com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress '{params, target}' '#cost>10' -x 2
    
    • trace- 方法内部调用路径,并输出方法路径上的每一个节点耗时,参数:
      • [E] : 正则匹配
      • [n:] : 命令执行次数
      • ”#cost“ : 方法执行耗时
    //同时监控多个方法, -j 表示过滤JDK函数
     trace -E com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress|getExpect
     //耗时筛选,此处1 指方法中某个步骤超过1毫秒,并非总执行时间
     trace -E -j com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress|getExpect '#cost>1'
    
    • stack- 输出当前方法被调用的调用路径
    //参数 -n表示执行次数,表示下两个请求将被监控, params[0]>0 参数过滤
    stack com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress 'params[0]>0' -n 2
    //耗时筛选
    stack com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress '#cost>5'
    
    • tt -方法执行的时空隧道,记录指定方法每次调用入参以及返回值,
    //基本使用 -n参数指定监控次数,不指定无限制,会将jvm内存耗尽
    tt -t  com.zhenai.profile.provider.modules.member.service.impl.AppointmentServiceImpl getAddress -n 3
    

    返回如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CuCKykW-1572862553766)(E:\learn\learn笔记\picture\tt命令返回.jpg)]

    //筛选指定方法名字调用
    tt -s 'method.name=="getAddress"'
    //查看指定编号对应详细信息
    tt -i 1001
    //重做指定编号请求
    tt -i 1004 -p
    

    参考文献

    展开全文
  • Arthas使用

    2021-10-12 14:53:51
    在命令行执行(使用和目标进程一致的用户启动,否则可能attach失败): java -jar arthas-boot.jar 执行该程序的用户需要和目标进程具有相同的权限。 java -jar arthas-boot.jar -h 打印更多参数信息。 选择应用的...

    启动

    在命令行执行(使用和目标进程一致的用户启动,否则可能attach失败):

    java -jar arthas-boot.jar
    

    执行该程序的用户需要和目标进程具有相同的权限。

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

    选择应用的Java进程即可。
    输入6,再enter。Arthas会attach到目标进程上,并输出日志:

    dashboard

    输入dashboard,enter,展示当前进程信息,按ctrl+c可以中断执行。

    thread

    获取到进程的Main Class

    参考

    • https://arthas.aliyun.com/doc/advanced-use.html
    展开全文
  • Arthas 使用笔记

    2021-07-15 15:31:47
    <h2 id="arthas-使用笔记">Arthas 使用笔记 查找某个类文件-democontroller热加载class">1.查找某个类文件 DemoControl

    Arthas 使用笔记

    1.查找某个类文件 DemoController,热加载class

    sc com.arthas.controller.DemoController
    
    # 在IDEA中修改,之后,编译
    mc /Users/develop/source/arthas-demo/src/main/java/com/arthas/controller/DemoController.java
    
    
    # 热加载
    redefine /Users/develop/source/zhuyong/arthas-demo/com/arthas/controller/DemoController.class
    
    

    2.获取线程状态

    # 获取当前最忙碌的前三个线程
    thread -n 3
    # 显示指定线程的运行堆栈
    thread 线程id
    
    # 找出当前阻塞其他线程的线程
    # 有时候我们发现应用卡住了, 通常是由于某个线程拿住了某个锁, 并且其他线程都在等待这把锁造成的。
    thread -b
    # 获取 WAITING 状态的线程
    thread --state WAITING
    thread --state TIMED_WAITING
    
    # 找出当前阻塞其他线程的线程
    thread -b
    

    3. 获取 当前垃圾收集器,线程数量(jvm 命令)

    jvm
    
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     GARBAGE-COLLECTORS
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     PS Scavenge                                    name : PS Scavenge
     [count/time (ms)]                              collectionCount : 4
                                                    collectionTime : 56
    
     PS MarkSweep                                   name : PS MarkSweep
     [count/time (ms)]                              collectionCount : 2
                                                    collectionTime : 78
    
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     THREAD
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
     COUNT                                          34 # JVM当前活跃的线程数
     DAEMON-COUNT                                   30 # JVM当前活跃的守护线程数
     PEAK-COUNT                                     36 # 从JVM启动开始曾经活着的最大线程数
     STARTED-COUNT                                  51 # 从JVM启动开始总共启动过的线程次数
     DEADLOCK-COUNT                                 0  # JVM当前死锁的线程数
    

    4.查询方法调用链路,以及方法耗时:

    命令: trace

    eg:

    # trace com.letus.sttrp.service.impl.ReportLogServiceImpl getReportLogList
    [arthas@35897]$ trace -n 3 com.xx.ReportLogServiceImpl getReportLogList
    Press Q or Ctrl+C to abort.
    Affect(class count: 2 , method count: 2) cost in 360 ms, listenerId: 1
    `---ts=2021-02-05 16:22:37;thread_name=http-nio-8088-exec-12;id=c5;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@431e9b93
        `---[24.287345ms] com.xx.service.impl.ReportLogServiceImpl$$EnhancerBySpringCGLIB$$1:getReportLogList()
            `---[23.160698ms] org.springframework.cglib.proxy.MethodInterceptor:intercept()
                `---[21.818245ms] com.xx.service.impl.ReportLogServiceImpl:getReportLogList()
                    +---[0.023195ms] com.xx.dto.report.response.ReportLogListResponse:<init>() #122
                    +---[0.059662ms] com.xx.common.utils.UserSession:getCurrUserId() #123
                    +---[0.022441ms] com.xx.common.utils.UserSession:getCurrUserId() #124
                    +---[0.013002ms] com.xx.dto.report.request.ReportLogListRequest:setUserId() #124
                    +---[21.402332ms] com.xx.service.impl.ReportLogServiceImpl$1:<init>() #126
                    +---[0.017436ms] com.xx.utils.GeneratePageUtils:getResultList() #142
                    `---[0.011632ms] com.xx.dto.report.response.ReportLogListResponse:setReportLogDtos() #142
    
    据调用耗时过滤

    [-n N] trace N 次

    trace -n 3 com.xx.impl.ReportLogServiceImpl getReportLogList  '#cost > 10'
    

    只会展示耗时大于10ms的调用路径,有助于在排查问题的时候,只关注异常情况

    5.更专业的耗时分析

    tt -t -n 3 com.xx.service.impl.ReportLogServiceImpl getReportLogList
    
    tt -t -n 3 com.xx.service.impl.WarehouseInventoryServiceImpl warehouseAccountInventoryList
    
    tt -t -n 3 com.xx.controller.WarehouseInventoryController warehouseAccountInventoryList
    
    trace com.lxx.service.impl.WarehouseInventoryServiceImpl warehouseAccountInventoryList
    

    heapdump

    展开全文
  • arthas使用笔记

    2020-07-12 22:45:40
    arthas使用笔记: ????一、常用命令 ????基础命令 help——查看命令帮助信息 cat——打印文件内容,和linux里的cat命令类似 echo–打印参数,和linux里的echo命令类似 grep——匹配查找,和linux里的grep命令类似...

    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

    Arthas可以帮助解决:

    1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

    2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

    3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

    4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!

    5. 是否有一个全局视角来查看系统的运行状况?

    6. 有什么办法可以监控到JVM的实时运行状态?

    7. 怎么快速定位应用的热点,生成火焰图?

    arthas使用笔记:

    🌕一、常用命令
    📌基础命令

    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 的线程堆栈信息
    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——查看JVM已加载的类信息
    sm——查看已加载类的方法信息
    jad——反编译指定已加载类的源码
    mc——内存编译器,内存编译.java文件为.class文件
    redefine——加载外部的.class文件,redefine到JVM里
    dump——dump 已加载类的 byte code 到特定目录
    classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

    🌕二、使用
    📌下载

    $ wget https://alibaba.github.io/arthas/arthas-boot.jar

    📌启动arthas

    $ java -jar arthas-boot.jar  --启动arthas
    $ java -jar arthas-boot.jar -h  --查看帮助
    启动之后选择对应的java进程,输入序号回车。

    📌打开监控大盘

    $ dashboard

    📌查看对应线程

    $ thread pid
    $ thread pid | grep 'main('  --查找main class

    📌查看jvm已加载的类

    $ sc *UserController (-d 打印详细加载信息)

    📌查看jvm已加载的类的方法信息

    $ sm com.example.demo.arthas.user.UserController

    📌反编译jvm已加载的类

    $ jad com.example.demo.arthas.user.UserController

    📌实时查看方法的返回值、抛出异常、入参

    $ watch [class-pattern] [method-pattern] [express] [condition-express]
    [express]:主要由ognl表达式,可组合:[params(参数), returnObj(返回值), target(当前对象), throwExp(异常信息)]
    [condition-express]:
        4个观察事件点:-b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后; 
        -x 2:指定输出结果的属性遍历深度,默认为1
        -n 2:指定执行次数
        条件表达式: 'params[0]<0' 根据参数值过滤、 '#cost>200' 根据耗时过滤
    eg:
    $ watch com.example.demo.arthas.user.UserController hello  "{params,returnObj}" -x 3  --监控该方法的入参、返回值,并且打印属性遍历深度2
    $ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2 观察异常信息
    $ watch com.example.demo.arthas.user.UserController hello  'target.log' -n 2  观察参数变化情况

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

    $ trace [class-pattern] [method-pattern] [condition-express]  --与watch相似,[condition-express]: -n 次数、 #cost    耗时
    $ [arthas@10107]$ trace com.example.demo.arthas.user.UserController hello -n 1 --监控查看该方法内部调用耗时情况

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

    $ trace [class-pattern] [method-pattern] [condition-express]  --与watch相似,[condition-express]: -n 次数

    📌thread

    $ thread [-h] [-b] [--lockedMonitors] [--lockedSynchronizers] [-i <value>] [--state <value>] [-n <value>] [id]
    $ thread -n  --指定最忙的前N个线程并打印堆栈,cpu占用最高
    $ thread 1322 --显示指定线程的运行堆栈
    $ thread -b  --找出当前阻塞其他线程的线程
    $ thread -n 3 -i 5000  --查看5秒内的CPU使用率top n线程栈

    📌refine 热更新代码

    1.修改源码:
    $ jad --source-only com.example.demo.arthas.user.UserController > /tmp/UserController.java  --导出源码到目标文件夹
    2.使用memory compile,结合classLoader重新编译源码
    $ sc -d *UserController | grep classLoaderHash  --获取该类对应的classLoader hash
    $ mc -c 5674cd4d /tmp/UserController.java  -d /tmp  --mc重新编译到目标文件夹
    3.使用refine重新加载class文件
    $ mc -c 5674cd4d /tmp/UserController.java  -d /tmp

    📌ognl使用

    动态更新应用Logger Level:
    $ sc -d com.example.demo.arthas.user.UserController | grep classLoaderHash。--获取classLoader hash
    $ ognl -c 1be6f5c3 '@com.example.demo.arthas.user.UserController@logger'  --根据hash获取UserController.logger属性
    $ ognl -c 5674cd4d '@com.example.demo.arthas.user.UserController@logger.setLevel(@ch.qos.lognull.classic.Level@DEBUG)'。--根据hash重新设置logger的值

     

    $ ognl -c 1be6f5c3 '@org.slf4j.LoggerFactory@getLogger("root").setLevel(@ch.qos.logback.classic.Level@DEBUG)'  --通过获取root logger,修改全局的logger level

    📌tt(TimeTunnel:监控记录指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测)

    获取Spring Context
    $ tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod --使用tt命令获取到spring context
    $ tt -i 1000 -w 'target.getApplicationContext()' --使用tt命令从调用记录里获取到spring context
    $ tt -i 1000 -w 'target.getApplicationContext().getBean("helloWorldService").getHelloMessage()' --获取spring bean,并调用函数

    📌classLoader 查看classloader的继承树,urls,类加载信息

    📌reset 显式清除清除增加代码,Arthas在 watch/trace 等命令时,实际上是修改了应用的字节码,插入增强的代码。显式执行 reset 命令,可以清除掉这些增强代码。

     

    展开全文
  • Arthas 使用的四种方式.pdf
  • 主要介绍了Java开源诊断工具Arthas使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Arthas Arthas is a Java Diagnostic tool open sourced by Alibaba. Arthas allows developers to troubleshoot production issues for Java applications without modifying code or restarting servers. ...
  • 安装和启动arthas从一个全局视角来查看系统的运行状况线上出现问题,线下无法重现,利用arthas进行调试——“线上调试”1 使用watch。2 使用tt。3 使用stack。服务RT latency 上升,如何定位慢调用?1 使用trace 。2...
  • Arthas使用方法

    2021-01-25 22:23:02
    1、简介 Arthas 是Alibaba开源的Java诊断工具。...2、工具使用 2.1 启动 $ java -jar arthas-boot.jar * [1]: 35542 [2]: 71560 arthas-demo.jar Demo进程是第2个,则输入2,再输入回车/enter。Arthas会attac...
  • 线上问题排查利器Arthas使用记录

    千次阅读 2019-07-24 13:55:22
    线上问题排查利器Arthas使用记录 安装 curl -L https://alibaba.github.io/arthas/install.sh | sh 打开 ./as.sh或者java -jar arthas-boot.jar 查看cpu占用高的3个线程 类似top -H,但是能看到堆栈信息 thread...
  • Arthas 使用实践

    2021-02-08 10:22:23
    文章目录1、Arthas2、学习总结2.1、所有环境都在线上,学习时不用自己搭环境2.2、官方文档2.3、相关参考博文2.4、idea arthas 插件3、各种捣腾3.1、Arthas 下载使用3.2、支持管道操作3.3、基础命令3.4、进阶命令4 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,986
精华内容 3,594
关键字:

arthas使用