Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden

Arthas

Alibaba Arthas ist ein Tool zum Überwachen und Profilieren von Java-Anwendungen. Die Funktion besteht darin, dass sie verwendet werden kann, ohne die Einstellungen zu ändern oder die überwachte Anwendung neu zu starten. Es gibt viele Dinge, die Arthas tun kann, und ich habe früher nur einige der Funktionen verwendet, aber als ich es noch einmal nachgeschlagen habe, habe ich festgestellt, dass ich verschiedene Dinge tun kann, deshalb möchte ich auf die Einführung eingehen.

Installieren und ausführen

Führen Sie zum Installieren und Ausführen von Arthas einfach den folgenden Befehl aus (für Linux): Arthas selbst ist eine Java-Anwendung, sodass sie in anderen Umgebungen ausgeführt werden kann.

$ curl -O https://arthas.aliyun.com/arthas-boot.jar
$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.4.0
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 631 org.logstash.Logstash
  [2]: 3834 camel-springboot-rest-test-0.0.1-SNAPSHOT.jar

Die ausgeführte Java-Anwendung wird in den beiden folgenden Zeilen angezeigt. Geben Sie daher den zu überwachenden Prozess ein.

2 ★ Diesmal"2"Eingeben
[INFO] arthas home: /root/.arthas/lib/3.4.1/arthas
[INFO] Try to attach process 3834
[INFO] Attach process 3834 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.4.1                                                                 
pid       3834                                                                  
time      2020-09-12 01:17:02    

Instrumententafel

Mit dem Befehl dashboard können Sie ein Dashboard ausführen, das die Thread-Liste der Java-Anwendung, den Status der Heap-Nutzung usw. anzeigen kann. Drücken Sie "q", um den Vorgang zu beenden.

[arthas@3834]$ dashboard

image.png

Faden

Mit dem Befehl thread können Sie eine Liste von Threads anzeigen.

image.png

Sie können die Informationen eines bestimmten Threads anzeigen, indem Sie [Thread-ID] aus der obigen Liste verwenden.

[arthas@3834]$ thread 156
"Camel (camel-1) thread #1 - ThroughputLogger" Id=156 TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@74abfe92
    at sun.misc.Unsafe.park(Native Method)
    -  waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@74abfe92
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Stapelverfolgung anzeigen

Zeigt die Stapelverfolgung der Methode an.

stack [Klasse] [Methode]
[arthas@4939]$ stack mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 29 ms, listenerId: 5
ts=2020-09-12 01:47:58;thread_name=http-nio-8080-exec-8;id=18;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@710f4dc7
    @mkyz08.example.HelloRestController.hello()
        at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:215)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:142)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)

 

Führen Sie die folgenden Schritte aus, um die Anzahl der Impressionen zu begrenzen.

stack [Klasse] [Methode] -n [Anzahl der Hinrichtungen]

Überwachung der Methodenausführung

Überwachen Sie Informationen wie Methodenrückgabewerte, Ausnahmen und Parameter. Es kann mit dem Befehl watch ausgeführt werden.

watch [Klasse] [Methode] [Andere Optionen]

"{params, returnObj}" zeigt den Rückgabewert und die Parameter nach der Ausführung an. "-x 2" ist die Anzeigetiefe.

[arthas@4939]$ watch mkyz08.example.HelloRestController hello "{params,returnObj}" -x 2 
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 19
ts=2020-09-12 05:24:36; [cost=1.155725ms] result=@ArrayList[
    @Object[][
        @String[hoge],
    ],
    @String[Hello World],
]

Verwenden Sie "{params, returnObj} -b", um den Rückgabewert und die Parameter anzuzeigen, bevor Sie die Methode ausführen. Obwohl der Rückgabewert angegeben ist, ist er immer null, da er noch nicht ausgeführt wurde.

[arthas@4939]$ watch mkyz08.example.HelloRestController hello "{params,returnObj}" -x 2 -b
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 36 ms, listenerId: 20
ts=2020-09-12 05:25:06; [cost=0.03669ms] result=@ArrayList[
    @Object[][
        @String[hoge],
    ],
    null,
]

Protokollstufe ändern

Zeigen Sie die Logger-Informationen mit dem Logger-Befehl an.

[arthas@4939]$ logger
 name                  ROOT                                                                                                      
 class                 ch.qos.logback.classic.Logger                                                                             
 classLoader           org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e                                           
 classLoaderHash       685f4c2e                                                                                                  
 level                 INFO                                                                                                      
 effectiveLevel        INFO                                                                                                      
 additivity            true                                                                                                      
 codeSource            jar:file:/root/camel-springboot-rest-test-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/logback-classic-1.2.3.jar!/    
 appenders             name            CONSOLE                                                                                   
                       class           ch.qos.logback.core.ConsoleAppender                                                       
                       classLoader     org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e                           
                       classLoaderHash 685f4c2e                                                                                  
                       target          System.out   

Sie können die Protokollebene mit dem folgenden Befehl ändern.

$ logger --name ROOT --level DEBUG
Update logger level success.

Im Fall von Spring-Boot musste der Klassenlader mit "-c" angegeben werden.

$ logger --name ROOT --level DEBUG -c 685f4c2e
Update logger level success.

MBean-Informationen anzeigen

Sie können MBean-Informationen mit dem Befehl mbean anzeigen.

[arthas@4939]$ mbean org.apache.camel:context=MyCamelRestApp,type=routes,* ExchangesCompleted
 OBJECT_NAME         org.apache.camel:context=MyCamelRestApp,type=routes,name="hello world route"                                
--------------------------------------------------------------------------------------------------                               
 NAME                VALUE                                                                                                       
--------------------------------------------------------------------------------------------------                               
 ExchangesCompleted  78                                                                                                          

Holen Sie sich einen Heap-Dump

Sie können einen Heap-Dump mit dem Befehl heapdump abrufen.

[arthas@4939]$ heapdump /tmp/dump.hprof
Dumping heap to /tmp/dump.hprof ...
Heap dump file created

Wenn "--live" angegeben ist, wird FullGC ausgeführt, bevor der Heap-Dump erfasst wird.

[arthas@4939]$ heapdump --live /tmp/dump_live.hprof
Dumping heap to /tmp/dump_live.hprof ...
Heap dump file created

async-profiler

Versuchen Sie, Ihre Anwendung mit dem Async-Profiler zu profilieren.

[arthas@4939]$ profiler start
Started [cpu] profiling

#Überprüfen Sie die Anzahl der Beispieldatenerfassungen
[arthas@4939]$ profiler getSamples
2

#Überprüfen Sie den Profiler-Status
[arthas@4939]$ profiler status
[perf] profiling is running for 19 seconds

[arthas@4939]$ profiler stop
OK
profiler output file: /root/arthas-output/20200912-022458.svg

Wenn Sie den Profiler mit "Profiler Stop" stoppen, wird die SVG-Datei ausgegeben. Sie können auch in HTML ausgeben. Das erfasste Flammendiagramm ist wie folgt.

image.png

Trace-Methodenaufrufe

Sie können Methodenaufrufe mit dem Befehl trace verfolgen. Der Trace zeigt auch die Ausführungszeit jeder Methode an, sodass Sie damit analysieren können, welche Methode langsamer ist.

[arthas@4939]$ trace mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 72 ms, listenerId: 7
`---ts=2020-09-12 02:11:16;thread_name=http-nio-8080-exec-3;id=13;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@710f4dc7
    `---[1.01167ms] mkyz08.example.HelloRestController:hello()
        +---[0.130848ms] org.apache.camel.CamelContext:getEndpoint() #26
        `---[0.649678ms] org.apache.camel.ProducerTemplate:sendBody() #27

Führen Sie die folgenden Schritte aus, um die Anzahl der Ausführungen zu begrenzen.

trace [Klasse] [Methode] -n [Anzahl der Hinrichtungen]

Wenn Sie nur die Methoden extrahieren möchten, die für die angegebene Zeit ausgeführt wurden (im Beispiel 100 ms), führen Sie sie wie folgt aus.

trace [Klasse] [Methode] '#cost>100'

Nicht nur der Befehl trace, sondern Sie können auch den Befehl grep verwenden. Sie können es beispielsweise verwenden, um nach Paket zu filtern.

[arthas@5716]$ trace mkyz08.example.HelloRestController hello | grep mkyz08
Press Q or Ctrl+C to abort.
    `---[1.459843ms] mkyz08.example.HelloRestController:hello()
        `---[0.066367ms] mkyz08.example.HelloRestController:add() #29

Reverse Compilation

Mit dem Befehl jad können Sie den auf der JVM ausgeführten Bytecode rückwärts in den Quellcode kompilieren. Es kann verwendet werden, wenn Sie den Code der Methode überprüfen möchten, die von den Befehlen trace und stack angezeigt wird. Es scheint, dass es verwendet werden kann, um zu überprüfen, ob andere geänderte Inhalte auf den Server angewendet werden.

[arthas@4939]$ jad mkyz08.example.HelloRestController

ClassLoader:                                                                                                                     
+-org.springframework.boot.loader.LaunchedURLClassLoader@685f4c2e                                                                
  +-sun.misc.Launcher$AppClassLoader@70dea4e                                                                                     
    +-sun.misc.Launcher$ExtClassLoader@7c6908d7                                                                                  

Location:                                                                                                                        
file:/root/camel-springboot-rest-test-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/                                                     

/*
 * Decompiled with CFR.
 * 
 * Could not load the following classes:
 *  org.apache.camel.CamelContext
 *  org.apache.camel.Endpoint
 *  org.apache.camel.ProducerTemplate
 *  org.springframework.web.bind.annotation.RequestMapping
 *  org.springframework.web.bind.annotation.RequestMethod
 *  org.springframework.web.bind.annotation.RestController
 */
package mkyz08.example;

import javax.annotation.Resource;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.ProducerTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value={"/spring"})
public class HelloRestController {
    @Resource
    private ProducerTemplate producer = null;
    @Resource
    private CamelContext context;

    @RequestMapping(method={RequestMethod.GET}, value={"/hello"}, produces={"text/plain"})
    public String hello(String msg) {
        Endpoint end = this.context.getEndpoint("seda:hello_world");
        this.producer.sendBody(end, (Object)msg);
        return "Hello World";
    }
}

Affect(row-cnt:1) cost in 505 ms.

Klassen tauschen

Lesen Sie die externe Klassendatei und ersetzen Sie sie durch die Klasse in der JVM.

Beschränkungen -Argumente, Methodennamen und Rückgabewerte können nicht geändert werden. -Klassenfelder und -methoden können nicht geändert, hinzugefügt oder gelöscht werden.

[arthas@5716]$ redefine /root/HelloRestController.class 
redefine success, size: 1, classes:
mkyz08.example.HelloRestController

Methodenaufrufe überwachen

Verwenden Sie den Befehl monitor, um die Anzahl der Methodenausführungen, die durchschnittliche Ausführungszeit usw. zu überwachen.

monitor [Klasse] [Methode]

Ein Beispiel für das Ausführungsergebnis ist wie folgt. Geben Sie das Anzeigeintervall (Sekunden) mit der Option "-c" an.

[arthas@5716]$ monitor -c 5 mkyz08.example.HelloRestController hello
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 35 ms, listenerId: 3
 timestamp           class                         method                       total     success   fail      avg-rt(m  fail-rat 
                                                                                                              s)        e        
---------------------------------------------------------------------------------------------------------------------------------
 2020-09-12 06:40:2  mkyz08.example.HelloRestCont  hello                        1         1         0         0.40      0.00%    
 4                   roller                                                                                                      

 timestamp           class                         method                       total     success   fail      avg-rt(m  fail-rat 
                                                                                                              s)        e        
---------------------------------------------------------------------------------------------------------------------------------
 2020-09-12 06:40:2  mkyz08.example.HelloRestCont  hello                        9         9         0         0.97      0.00%    
 9                   roller                                                                                                      

 timestamp           class                         method                       total     success   fail      avg-rt(m  fail-rat 
                                                                                                              s)        e        
---------------------------------------------------------------------------------------------------------------------------------
 2020-09-12 06:40:3  mkyz08.example.HelloRestCont  hello                        5         5         0         0.26      0.00%    
 4                   roller       

VM-Optionen anzeigen

[arthas@4939]$ vmoption
 KEY                             VALUE                            ORIGIN                          WRITEABLE                      
---------------------------------------------------------------------------------------------------------------------------------
 HeapDumpBeforeFullGC            false                            DEFAULT                         true                           
 HeapDumpAfterFullGC             false                            DEFAULT                         true                           
 HeapDumpOnOutOfMemoryError      false                            DEFAULT                         true                           
~ Abkürzung ~

#Beim Ändern des Wertes

[arthas@4939]$ vmoption PrintGC true
Successfully updated the vm option.
 NAME     BEFORE-VALUE  AFTER-VALUE                                                                                              
------------------------------------                                                                                             
 PrintGC  false         true   

Andere grundlegende Befehle

help -Zeig Hilfe
cls -Löschen Sie den Bildschirm
session -Aktuelle Sitzungsinformationen anzeigen
reset - resets enhanced classes. All enhanced classes will be reset to their original states. When Arthas server closes, all these enhanced classes will be reset too
version -Arthas-Version anzeigen
history -Befehlsausführungsverlauf anzeigen
quit -Beenden Sie Arthas Client
stop -Stoppen Sie den Arthas-Server
keymap -Arthas Tastaturkürzel anzeigen

abschließend

Was ich früher mit verschiedenen Werkzeugen gemacht habe, kann jetzt mit Arthas gemacht werden. Es gibt auch viele andere Befehle als die diesmal eingeführten. Bitte überprüfen Sie sie auf der offiziellen Website. Interessant sah auch die Webkonsole aus.

Referenz

Recommended Posts

Ich habe versucht, das Java-Diagnosetool Arthas zu verwenden
Ich habe Javas Micro-Benchmarking-Tool JMH ausprobiert
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Arthas Java Diagnostic Tool
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe jetzt versucht, Anakia + Jing zu verwenden
Ich habe versucht, Spring + Mybatis + DbUnit zu verwenden
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, die Java8 Stream API zu verwenden
Ich habe versucht, JWT in Java zu verwenden
[Android] Ich habe versucht, das Koordinatorlayout zu verwenden.
Ich habe versucht, Pari GP Container zu verwenden
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, UICollectionViewListCell zu verwenden, das von Xcode12 hinzugefügt wurde.
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Es ist neu, aber ich habe versucht, Groonga zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, Junit mit Mac VScode Maven zu verwenden
[Für Anfänger] Ich habe versucht, JUnit 5 mit Eclipse zu verwenden
Ich habe versucht, ein Personalmanagement-Tool zu entwickeln
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe es mit Spring versucht.
[API] Ich habe versucht, die Postleitzahlensuch-API zu verwenden
Ich habe versucht, Tomcat zu setzen
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe versucht, den KMS-Dienst (Key Management Service) von Alibaba Cloud zu verwenden
Ich habe versucht, SQS mit AWS Java SDK zu betreiben
Ich habe versucht, das Migration Toolkit für Anwendungsbinärdateien zu verwenden
Ich habe versucht, Log4j2 auf einem Java EE-Server zu verwenden
Ich habe versucht, YOLO v4 unter Ubuntu und ROS zu verwenden
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Ich habe versucht, ein Aktienchart mit Java (Jsoup) zu kratzen.
[Ich habe es versucht] Spring Tutorial
Ich habe versucht, Autoware auszuführen
Ich habe sofort QUARKUS ausprobiert
Ich habe Spring Batch ausprobiert
Ich habe versucht, node-jt400 (Programme)
Ich habe versucht, node-jt400 (ausführen)
Ich habe versucht, node-jt400 (Transaktionen)