精华内容
下载资源
问答
  • Arthas
    2021-03-16 12:18:22

    2019年度最受欢迎中国开源软件看到jvm调优神器——arthas
    于是安装验证一下,也可参考官方文档Arthas 用户文档
    在使用之前,先看一个Linux strace命令你需要知道的16个Linux服务器监控命令

    执行strace -ff -o ./bdo -p 23809,可以查看到进程23809中所有线程的内核执行过程,arthas中应该有一些调用linux的基本命令

    recvfrom(402, "\0\0\0\2\0\0\0", 7, 0, NULL, NULL) = 7
    ioctl(402, FIONREAD, [0])               = 0
    ioctl(402, FIONREAD, [0])               = 0
    sendto(402, "\36\0\0\0\3select @@session.tx_read_on"..., 34, 0, NULL, 0) = 34
    ioctl(402, FIONREAD, [0])               = 0
    recvfrom(402, "\1\0\0\1", 4, 0, NULL, NULL) = 4
    ioctl(402, FIONREAD, [73])              = 0
    recvfrom(402, "\1,\0\0\2\3def\0\0\0\26@@session.tx_read_o"..., 73, 0, NULL, NULL) = 73
    ioctl(402, FIONREAD, [0])               = 0
    ioctl(402, FIONREAD, [0])               = 0
    sendto(402, "#\0\0\0\3set session transaction rea"..., 39, 0, NULL, 0) = 39
    ioctl(402, FIONREAD, [0])               = 0
    recvfrom(402, "\7\0\0\1", 4, 0, NULL, NULL) = 4
    ioctl(402, FIONREAD, [7])               = 0
    recvfrom(402, "\0\0\0\2\0\0\0", 7, 0, NULL, NULL) = 7
    ioctl(402, FIONREAD, [0])               = 0
    write(330, "\1", 1)                     = 1
    futex(0x7f97e95d7a24, FUTEX_WAIT_BITSET_PRIVATE, 59475, {57557167, 192371664}, ffffffff) = 0
    futex(0x7f97e95d79f8, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable)
    futex(0x7f97e95d79f8, FUTEX_WAKE_PRIVATE, 1) = 0
    write(1, "2021-03-16 12:27:14.395 INFO  c."..., 93) = 93
    write(308, "12:27:14.395 INFO  c.b.f.o.s.han"..., 76) = 76
    write(1, "2021-03-16 12:27:14.396 INFO  c."..., 101) = 101
    

    下面是arthas的基本引用

    [root@bg2 app]# curl -O https://alibaba.github.io/arthas/arthas-boot.jar
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  135k  100  135k    0     0  89227      0  0:00:01  0:00:01 --:--:-- 89269
    [root@bg2 app]# ll
    total 140
    -rw-r--r-- 1 root root 138993 Mar 16 11:23 arthas-boot.jar
    drwxr-xr-x 7   10  143   4096 Jul  7  2018 jdk1.8.0_181
    [root@bg2 app]# java -jar arthas-boot.jar
    [INFO] arthas-boot version: 3.4.5
    [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
    * [1]: 5280 org.apache.ambari.server.controller.AmbariServer
      [2]: 992 org.tanukisoftware.wrapper.WrapperSimpleApp
      [3]: 9477 org.apache.hadoop.hdfs.server.namenode.NameNode
      [4]: 25895 org.apache.livy.server.LivyServer
      [5]: 28007 org.apache.spark.deploy.history.HistoryServer
      [6]: 19755 org.apache.hadoop.yarn.server.nodemanager.NodeManager
      [7]: 24046 org.apache.hadoop.util.RunJar
      [8]: 12848 org.apache.hadoop.hbase.master.HMaster
      [9]: 14704 org.apache.phoenix.queryserver.server.QueryServer
      [10]: 26421 org.apache.hadoop.util.RunJar
      [11]: 8822 
      [12]: 16505 org.apache.hadoop.hbase.thrift2.ThriftServer
      [13]: 14303 org.apache.hadoop.hbase.regionserver.HRegionServer
    
    ########################## 因为ambari是python的程序,所以这里会报错
    1  
    [INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.5.0?mirror=aliyun
    [INFO] Download arthas success.
    [INFO] arthas home: /root/.arthas/lib/3.5.0/arthas
    [INFO] Try to attach process 5280
    [ERROR] Start arthas failed, exception stack trace: 
    com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
            at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
            at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
            at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
            at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:99)
            at com.taobao.arthas.core.Arthas.<init>(Arthas.java:26)
            at com.taobao.arthas.core.Arthas.main(Arthas.java:137)
    [ERROR] attach fail, targetPid: 5280
    

    没找到socket file就提示下面的异常

    [ERROR] Start arthas failed, exception stack trace: 
    com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
            at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106)
            at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:78)
            at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:250)
            at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:99)
            at com.taobao.arthas.core.Arthas.<init>(Arthas.java:26)
            at com.taobao.arthas.core.Arthas.main(Arthas.java:137)
    [ERROR] attach fail, targetPid: 28007
    

    将arthas与进程bdo.jar进行关联成功,进入到arthas的交互环境

    [root@bwsc52 application]# java -jar arthas-boot.jar
    [INFO] arthas-boot version: 3.4.5
    [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
    * [1]: 23809 bdo.jar
    1
    [INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.5.0?mirror=aliyun
    [INFO] File size: 12.22 MB, downloaded size: 2.15 MB, downloading ...
    [INFO] File size: 12.22 MB, downloaded size: 6.23 MB, downloading ...
    [INFO] File size: 12.22 MB, downloaded size: 8.70 MB, downloading ...
    [INFO] File size: 12.22 MB, downloaded size: 11.60 MB, downloading ...
    [INFO] Download arthas success.
    [INFO] Download arthas success.
    [INFO] arthas home: /root/.arthas/lib/3.5.0/arthas
    [INFO] Try to attach process 23809
    [INFO] Attach process 23809 success.
    [INFO] arthas-client connect 127.0.0.1 3658
      ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.                           
     /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'                          
    |  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.                          
    |  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |                         
    `--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'                          
                                                                                    
    
    wiki       https://arthas.aliyun.com/doc                                        
    tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html                  
    version    3.5.0                                                                
    main_class                                                                      
    pid        23809                                                                
    time       2021-03-16 11:35:42 
    [arthas@23809]$ 
    

    查看cpu的使用thread,从下图看是正常的

    
    [arthas@23809]$ thread
    Threads Total: 870, NEW: 0, RUNNABLE: 58, BLOCKED: 0, WAITING: 755, TIMED_WAITING: 47, TERMINATED: 0, Internal threads: 10                            
    ID    NAME                                  GROUP              PRIORITY    STATE        %CPU        DELTA_TIME   TIME        INTERRUPTED  DAEMON      
    23826 arthas-command-execute                system             5           RUNNABLE     24.08       0.239        0:0.488     false        true        
    -1    C2 CompilerThread0                    -                  -1          -            0.9         0.009        7:23.236    false        true        
    63    redisson-netty-4-5                    main               5           RUNNABLE     0.74        0.007        528:19.124  false        false       
    -1    C1 CompilerThread2                    -                  -1          -            0.46        0.004        4:24.470    false        true        
    23    Thread-7                              system             9           WAITING      0.45        0.004        3:15.760    false        true        
    24    SimplePauseDetectorThread_0           system             9           TIMED_WAITIN 0.32        0.003        92:31.434   false        true        
    58    pool-12-thread-1                      main               5           TIMED_WAITIN 0.17        0.001        96:36.543   false        false       
    59    redisson-netty-4-1                    main               5           RUNNABLE     0.15        0.001        36:54.021   false        false       
    60    redisson-netty-4-2                    main               5           RUNNABLE     0.13        0.001        49:41.481   false        false       
    25    elasticsearch[_client_][[timer]]      main               5           TIMED_WAITIN 0.11        0.001        64:34.247   false        true        
    64    redisson-netty-4-6                    main               5           RUNNABLE     0.1         0.001        40:56.540   false        false       
    40    elasticsearch[_client_][[timer]]      main               5           TIMED_WAITIN 0.09        0.000        64:56.965   false        true        
    35    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.07        0.000        68:55.662   false        true        
    61    redisson-netty-4-3                    main               5           RUNNABLE     0.07        0.000        40:9.429    false        false       
    771   Abandoned connection cleanup thread   main               5           TIMED_WAITIN 0.06        0.000        132:16.994  false        true        
    867   SystemTimer                           main               1           TIMED_WAITIN 0.05        0.000        640:51.449  false        true        
    863   pool-37-thread-1{Hashed wheel timer # main               5           TIMED_WAITIN 0.04        0.000        93:9.247    false        false       
    824   SimplePauseDetectorThread_2           main               5           TIMED_WAITIN 0.04        0.000        465:31.486  false        true        
    32    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.04        0.000        85:44.849   false        true        
    -1    VM Periodic Task Thread               -                  -1          -            0.03        0.000        143:42.067  false        true        
    822   SimplePauseDetectorThread_0           main               5           TIMED_WAITIN 0.03        0.000        459:42.045  false        true        
    65    redisson-netty-4-7                    main               5           RUNNABLE     0.02        0.000        40:4.071    false        false       
    36    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.02        0.000        69:52.316   false        true        
    823   SimplePauseDetectorThread_1           main               5           TIMED_WAITIN 0.02        0.000        456:44.616  false        true        
    62    redisson-netty-4-4                    main               5           RUNNABLE     0.02        0.000        38:57.459   false        false       
    42    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.02        0.000        108:58.594  false        true        
    30    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.02        0.000        95:29.021   false        true        
    28    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.01        0.000        76:42.378   false        true        
    50    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.01        0.000        64:35.136   false        true        
    34    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.01        0.000        73:10.340   false        tr
    

    查看线程是否存在死锁,这里没有出现这个情况

    [arthas@23809]$  thread -b
    No most blocking thread found!
    

    如果发生内存泄露,则调用dashboard命令进行查看,下面没有看到BLOCKED状态的线程,就可以不用管了。

    dashboard
    ID    NAME                                  GROUP              PRIORITY    STATE        %CPU        DELTA_TIME   TIME        INTERRUPTED  DAEMON      
    867   SystemTimer                           main               1           TIMED_WAITIN 0.0         0.000        640:54.165  false        true        
    -1    VM Thread                             -                  -1          -            0.0         0.000        588:37.784  false        true        
    63    redisson-netty-4-5                    main               5           RUNNABLE     0.0         0.000        528:25.859  false        false       
    824   SimplePauseDetectorThread_2           main               5           TIMED_WAITIN 0.0         0.000        465:33.064  false        true        
    822   SimplePauseDetectorThread_0           main               5           TIMED_WAITIN 0.0         0.000        459:43.597  false        true        
    823   SimplePauseDetectorThread_1           main               5           TIMED_WAITIN 0.0         0.000        456:46.142  false        true        
    826   lettuce-nioEventLoop-6-2              main               5           RUNNABLE     0.0         0.000        392:0.025   false        true        
    -1    VM Periodic Task Thread               -                  -1          -            0.0         0.000        143:43.694  false        true        
    771   Abandoned connection cleanup thread   main               5           TIMED_WAITIN 0.0         0.000        132:18.651  false        true        
    42    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        109:0.027   false        true        
    46    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        102:12.483  false        true        
    58    pool-12-thread-1                      main               5           TIMED_WAITIN 0.0         0.000        96:37.703   false        false       
    44    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        96:15.539   false        true        
    30    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        95:29.943   false        true        
    863   pool-37-thread-1{Hashed wheel timer # main               5           TIMED_WAITIN 0.0         0.000        93:10.358   false        false       
    836   pool-35-thread-1{Hashed wheel timer # main               5           TIMED_WAITIN 0.0         0.000        93:1.143    false        false       
    24    SimplePauseDetectorThread_0           system             9           TIMED_WAITIN 0.0         0.000        92:32.502   false        true        
    47    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        90:23.412   false        true        
    31    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        89:10.260   false        true        
    33    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        86:56.440   false        true        
    32    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        85:45.674   false        true        
    45    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        81:21.415   false        true        
    28    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        76:43.069   false        true        
    34    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        73:11.123   false        true        
    48    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        70:32.459   false        true        
    36    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        69:52.974   false        true        
    35    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        68:56.311   false        true        
    40    elasticsearch[_client_][[timer]]      main               5           TIMED_WAITIN 0.0         0.000        64:57.801   false        true        
    50    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        64:35.837   false        true        
    25    elasticsearch[_client_][[timer]]      main               5           TIMED_WAITIN 0.0         0.000        64:34.984   false        true        
    49    elasticsearch[_client_][transport_cli main               5           RUNNABLE     0.0         0.000        64:11.541   false        true        
    835   Avro NettyTransceiver I/O Worker 8{Ne main               5           RUNNABLE     0.0         0.000        58:36.468   false        true        
    834   Avro NettyTransceiver I/O Worker 7{Ne main               5           RUNNABLE     0.0         0.000        50:9.839    false        true        
    60    redisson-netty-4-2                    main               5           RUNNABLE     0.0         0.000        49:42.133   false        false       
    828   Avro NettyTransceiver I/O Worker 1{Ne main               5           RUNNABLE     0.0         0.000        48:18.746   false        true        
    Memory                          used       total      max       usage      GC                                                                         
    heap                            384M       783M       843M      45.65%     gc.ps_scavenge.count                  21462                                
    ps_eden_space                   77M        294M       300M      25.67%     gc.ps_scavenge.time(ms)               2003799                              
    ps_survivor_space               4M         4M         4M        91.06%     gc.ps_marksweep.count                 10                                   
    ps_old_gen                      303M       485M       632M      48.03%     gc.ps_marksweep.time(ms)              6320                                 
    nonheap                         190M       242M       -1        78.50%                                                                                
    code_cache                      35M        77M        240M      14.61%                                                                                
    metaspace                       138M       146M       -1        94.52%                                                                                
    compressed_class_space          17M        18M        1024M     1.67%                                                                                 
    direct                          131M       131M       -         100.00%                                                                               
    mapped                          0K         0K         -         0.00%                                                                                 
    Runtime                                                                                                                                               
    os.name                                                                    Linux                                                                      
    os.version                                                                 3.10.0-327.el7.x86_64                                                      
    java.version                                                               1.8.0_151                                                                  
    java.home                                                                  /usr/java/jdk1.8.0_151/jre                                                 
    systemload.average                                                         0.28                                                                       
    processors                                                                 4                                                                          
    timestamp/uptime                                                           Tue Mar 16 11:46:58 CST 2021/9650054s                                      
    
    

    下载内存快照

    [arthas@23809]$ heapdump --live /root/jvm.hprof
    Dumping heap to /root/jvm.hprof ...
    Heap dump file created
    

    这里照着《java并发编程的艺术》,写一个死锁的例子

    public class DeadLockDemo {
        private static String A = "A";
        private static String B = "B";
    
        public static void main(String[] args) {
            new DeadLockDemo().deadLock();
        }
    
        private void deadLock() {
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (A) {
                        try {
                            Thread.currentThread().sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        synchronized (B) {
                            System.out.println("1");
                        }
                    }
                }
            });
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (B) {
                        synchronized (A) {
                            System.out.println("2");
                        }
                    }
                }
            });
            t1.start();
            t2.start();
        }
    }
    
    

    执行java -cp threads-1.0.jar com.dzmsoft.thhreads.one.DeadLockDemo,可以看到两个两个进程死锁,根据进程号,定位问题在哪里。
    1
    现在我们介绍避免死锁的几个常见方法。 ·避免一个线程同时获取多个锁。 ·避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。 ·尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。 ·对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

    更多相关内容
  • Arthas(阿尔萨斯)是阿里巴巴开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么...
  • 阿里巴巴出了一款名叫Arthas的工具,可以在线分析诊断Java代码,让人眼前一亮。 Arthas 是什么? Arthas(阿尔萨斯) 是阿里开源的一个Java在线分析诊断工具。 Arthas 能解决啥问题? 在日常开发上线过程中,我们多多少...
  • 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路; 4、基础知识讲解透彻、详尽; 5、JVM零基础也能听懂。 第一节:学习JVM的意义和目标 1.1 意义: 1.2 目标: 第...
  • Arthas基本使用.rar,Arthas基本使用.md
  • arthas-离线版.tar.gz

    2021-12-09 16:36:11
    离线版arthas,下载后直接就可以使用在无外网环境
  • idea的arthas插件

    2021-08-22 22:34:30
    idea2021版本, arthas插件
  • arthas 3.3.6

    2020-07-15 16:13:31
    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行...
  • 阿尔萨斯 Arthas是由阿里巴巴开源的Java诊断工具。 Arthas允许开发人员解决Java应用程序的生产问题,而无需修改代码或重新启动服务器。背景通常,无法从本地开发环境访问生产系统网络。 如果生产系统遇到问题,则...
  • Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具,开始在淘宝内部孵化使用,后来成为阿里java项目必须使用的内部工具。2018年arthas成为ali开源项目,代码托管在github上。这是带给java系一大福音,项目深受...
  • Arthas线上应用诊断利器概述.pdf
  • arthas-bin.zip

    2020-08-07 18:04:39
    arthas-bin.zip,as-service.bat,arthas-spy.jar,arthas-client.jar,arthas-boot.jar,as.bat,async-profiler,libasyncProfiler-linux-x64.so,libasyncProfiler-linux-arm.so,libasyncProfiler-mac-x64.so,arthas-demo...
  • 阿里的Arthas的使用说明精简版, 对常用的Java程序的监控、排查内存溢出问题等, 有较好的指导作用,希望对大家有帮助
  • arthas教程详解

    2020-05-19 10:20:56
    当你遇到以下类似问题而束手无策时, Arthas 可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线...
  • Arthas是阿里巴巴开源的 Java 诊断工具。 Arthas 允许开发人员在不修改代码或重新启动服务器的情况下解决 Java 应用程序的生产问题。 背景 很多时候,生产系统网络无法从本地开发环境访问。 如果在生产系统中遇到...
  • 程序性能检查工具,用于定位java性能问题,arthas 具体有开源地址,需要的话去github上搜索arthas
  • Arthas是阿里巴巴开源的 Java 诊断工具。 Arthas 允许开发人员在不修改代码或重新启动服务器的情况下解决 Java 应用程序的生产问题。 背景 很多时候,生产系统网络无法从本地开发环境访问。 如果在生产系统中遇到...
  • 内部公司一个关于Java诊断工具Arthas.ppt分享,Arthas 是阿里巴巴在2018年开源出来的一款 Java 诊断利器,它主要是针对线上环境,能够帮助我们更好的定位问题。 截止到2019年8月29日,在Github上总共被916人watch,...
  • Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?...
  • arthas 工具全量jar包

    2019-04-09 12:52:01
    阿里 arthas全量jar包,官方3.1.0版本,java调试工具,监控java代码运行,调试代码,离线文档在另外一份资源里面,官网下载太慢,这里放一份,资源分不知道怎么修改,联系本人所有资源免费发送
  • arthas-boot.jar

    2020-04-21 20:04:05
    Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行...
  • Arthas

    千次阅读 2020-11-01 17:07:27
    文章目录Arthas启动/重进入启动常见问题生产环境修改代码、更新场景实时修改生产环境日志级别场景便捷地修改JVM参数其他命令更好用的工具 Arthas 启动/重进入 启动 # 一般arthas的jar包下载都会放在默认当前位置下...

    Arthas

    启动/重进入

    1. 启动

      # 一般arthas的jar包下载都会放在默认当前位置下,如果当前为root角色
      # cd ~
      # cd .arthas/lib/3.4.3/arthas
      # 需要管理权限才可以启动,也可以进入 cd .arthas/lib/版本/arthas,再执行
      sudo java -jar arthas-boot.jar
      
    2. 重进入

      重进入是指,退出终端之后,下次想要再次连接到arthas内

      telnet localhost 3658
      

    启动常见问题

    1. Unable to open socket file: target process not responding or HotSpot VM not loaded

      官方解答地址

      • 先试着能不能用jstack pid 连上,如果jstack pid连接也报这个错,那基本可以去各大搜索引擎查找问题了
      • 如果最终你试了N种方法都不行,比如网上最多的回答==/tmp/hsperfdata_$USER==消失引起的(这里我也查了,是存在的),那么你可以试着更新下机器上的JDK。我机器上原来的open-jdk版本是1:1.8.0.252.b09-3.el8_2,怎么都不行。更新到java-1.8.0-openjdk-1:1.8.0.265.b01-0.el8_2.x86_64就可以了

    以下是本人在实际开发中用到的使用场景,更多场景可见Arthas官方文档

    生产环境修改代码、更新

    实际开发很容易遇到的场景:

    ​ 生产环境出现紧急问题。在线下修改代码,并测试通过。这时可能只修改了几个文件,或者只加了几行代码。那么生产环境的jar包要重新停掉、并重新打包、部署、发布。影响的范围就更大了。这时热更新.class文件就可以了

    arthas为我们提供了一站式的解决步骤,从读取.class文件----->编译成.java文件------->修改.java文件------>将修改后的.java文件编译成新的.class文件-------->将新的.class文件通过classloader加载进JVM内

    实际场景中,前面的步骤其实都可以从线下做完,将线下编译的.calss文件传到服务器上,并执行最后一步,加载进JVM内即可。详细步骤参考官方文档

    这里使用arthas的一系列命令演示线上问题修复过程

    场景

    1. 首先,使用sc命令找到要修改的类.sc全称-search class, -d表示detail,主要是为了获取classLoader的hash值

      sc -d *UserController*
      

    在这里插入图片描述

    这里可以看到详细的类的信息

    1. 拿到类的classloader的哈希值,就开始修改代码

    2. 修改代码的第一步,首先使用jad命令将.class文件反编译为.java文件才行。-c 指定这个类的classloader的哈希值,–source-only只显示源码,最后是文件反编译之后的存放路径

      jad -c 49c2faae --source-only *SysUserController* > /xxx要保存的具体路径/SysUserController.java
      

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

    截取了部分代码,如上。可以看到,已经拿到了Java代码

    1. 进行修改代码,这里只加入一句代码

      System.pit.println("有人登录了---");
      

    在这里插入图片描述

    1. 修改完毕之后,使用mc(Memory Compiler)命令,将Java文件重新编译为.class文件. -d 指定编译之后的.class文件的位置,最后一个参数为刚才修改的Java文件的位置

      mc -c 49c2faae -d /tmp /xxx具体的路径/SysUserController.java
      

    在这里插入图片描述

    1. 拿到.class文件之后,重新加载进JVM内即可.使用redefine

      redefine -c 49c2faae /xxx具体.class文件的路径/SysUserController.class
      

    在这里插入图片描述

    提示加载成功

    1. 重新登录,查看修改是否生效
      在这里插入图片描述

      可以看到,确实是生效了

    实时修改生产环境日志级别

    生产环境日志一般为warn、error级别的,对于debug日志一般看不到,那么出问题的时候,一些日志,在写代码的时候会被记录在debug日志中,而此时日志级别又很高。那么迫切需要调整日志级别

    场景

    1. 查看当前应用日志级别

      logger
      

    在这里插入图片描述

    可以看到目前日志级别为INFO

    1. 修改日志级别

      logger -c 49c2faae --name ROOT --level debug
      

    在这里插入图片描述

    可以看到这里的日志修改成功了

    注意事项

    redefine命令使用之后,再使用jad命令会使字节码重置,恢复为未修改之前的样子。官方关于redefine命令的说明

    便捷地修改JVM参数

    一般的查看JVM参数,使用Java自带的jinfo命令即可.例如

    查看某一个Java应用的JVM参数

    # 找到Java应用的jps - java process status
    jps -l
    

    在这里插入图片描述

    再使用jinfo

    # 查看所有参数配置情况
    jinfo 16018
    # 查看某个参数的配置情况
    jinfo -flag HeapDumpOnOutOfMemoryError 16018
    # 帮助
    jinfo -h
    

    在arthas中,直接一个单词即可.打印出JVM的参数配置情况

    vmoption
    

    在这里插入图片描述修改JVM参数,这里设置JVM出现OutOfMemoryError的时候,自动dump堆快照

    vmoption HeapDumpOnOutOfMemoryError true
    

    在这里插入图片描述

    使用jinfo则是

    jinfo -flag +HeapDumpOnOutOfMemoryError 16018
    

    +代表开启,-代表关闭

    其他命令

    全部命令可参考Arthas官方文档

    更好用的工具

    去哪的Java问题排查工具Bistoury是以Arthas基础进行开发的,提供了图形界面操作,很方面。个人觉得最赞的功能是可以在生产环境debug的功能。项目GitHub地址

    展开全文
  • arthas,阿里巴巴Java.zip

    2019-09-26 04:47:32
    arthas是一个由阿里巴巴开源的java诊断工具。
  • arthas简单使用

    2021-01-13 18:17:58
    artahs
  • arthas-packaging-3.4.4-bin.zip
  • 研发-Java诊断工具-Arthas
  • 为您提供Arthas开源的Java诊断工具下载,Arthas(阿尔萨斯)是阿里巴巴开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种...
  • arthas-idea-plugin.zip

    2020-06-16 12:47:40
    当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,545
精华内容 5,018
关键字:

Arthas