下载arthas-boot.jar:
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
然后用java -jar的方式启动:
[admin@iZuf6gnkapo0o1vc1cenqdZ arthas]$ java -jar arthas-boot.jar
[INFO] arthas-boot version: 3.1.0
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 20148 org.apache.catalina.startup.Bootstrap
[2]: 4229 org.apache.catalina.startup.Bootstrap
[3]: 1801 org.apache.catalina.startup.Bootstrap
[4]: 19787 org.apache.catalina.startup.Bootstrap
选择一个pid进入(如1):
[4]: 19787 org.apache.catalina.startup.Bootstrap
1
[INFO] arthas home: /home/admin/.arthas/lib/3.1.1/arthas
[INFO] Try to attach process 20148
[INFO] Attach process 20148 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://alibaba.github.io/arthas
tutorials https://alibaba.github.io/arthas/arthas-tutorials
version 3.1.1
pid 20148
time 2019-08-14 09:14:38
通过thread可以查看是否有线程出错:
253 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
254 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
255 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
256 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
258 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
260 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
262 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
263 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
264 DubboServerHandler-10.25.23.152: main 5 WAITING 0 0:0 false true
3 Finalizer system 8 WAITING 0 0:0 false true
11 GC Daemon system 2 TIMED_WAIT 0 0:0 false true
55 Hashed wheel timer #1 main 5 TIMED_WAIT 0 0:32 false false
1238 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1682 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1688 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1689 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1692 MySQL Statement Cancellation Tim main 5 TIMED_WAIT 0 0:0 false true
1693 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1694 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1695 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1696 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1697 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1698 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1699 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1701 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1703 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1705 MySQL Statement Cancellation Tim main 5 TIMED_WAIT 0 0:0 false true
1708 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
1711 MySQL Statement Cancellation Tim main 5 WAITING 0 0:0 false true
输入其他线程id
$ thread 50
"localhost-startStop-1-EventThread" Id=50 WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@7ec958cb
at sun.misc.Unsafe.park(Native Method)
- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@7ec958cb
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:494)
Affect(row-cnt:0) cost in 232 ms.
$ thread 26588
"nioEventLoopGroup-2-1" Id=26588 RUNNABLE (in native)
at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
- locked io.netty.channel.nio.SelectedSelectionKeySet@57582703
- locked java.util.Collections$UnmodifiableSet@542d67b6
- locked sun.nio.ch.EPollSelectorImpl@90e0d74
at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62)
at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:791)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:439)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:745)
Affect(row-cnt:0) cost in 184 ms
jvm 查看当前jvm信息,直接输入jvm即可(如下所示):
jvm
RUNTIME
------------------------------------------------------------------------------------------------------------------------------------
MACHINE-NAME 20148@iZuf6gnkapo0o1vc1cenqdZ
JVM-START-TIME 2019-08-12 14:45:57
MANAGEMENT-SPEC-VERSION 1.2
SPEC-NAME Java Virtual Machine Specification
SPEC-VENDOR Oracle Corporation
SPEC-VERSION 1.8
VM-NAME OpenJDK 64-Bit Server VM
VM-VENDOR Oracle Corporation
VM-VERSION 25.91-b14
INPUT-ARGUMENTS -Djava.util.logging.config.file=/app/tomcat-8080/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xms1024m
-Xmx1024m
-Xmn256m
-XX:PermSize=256m
-Xss256k
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:LargePageSizeInBytes=128m
-XX:+UseFastAccessorMethods
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-Djava.endorsed.dirs=/app/tomcat-8080/endorsed
-Dcatalina.base=/app/tomcat-8080
-Dcatalina.home=/app/tomcat-8080
-Djava.io.tmpdir=/app/tomcat-8080/temp
CLASS-PATH /app/tomcat-8080/bin/bootstrap.jar:/app/tomcat-8080/bin/tomcat-juli.jar
BOOT-CLASS-PATH /alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/resources.jar:/alidata1/java-
1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/rt.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91
-1.b14.el6.x86_64/jre/lib/sunrsasign.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86
_64/jre/lib/jsse.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/jce.jar:
/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/charsets.jar:/alidata1/java-1
.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/jfr.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91
-1.b14.el6.x86_64/jre/classes
LIBRARY-PATH :/app/tomcat-8080/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
------------------------------------------------------------------------------------------------------------------------------------
CLASS-LOADING
------------------------------------------------------------------------------------------------------------------------------------
LOADED-CLASS-COUNT 23069
TOTAL-LOADED-CLASS-COUNT 23087
UNLOADED-CLASS-COUNT 18
IS-VERBOSE false
------------------------------------------------------------------------------------------------------------------------------------
COMPILATION
------------------------------------------------------------------------------------------------------------------------------------
NAME HotSpot 64-Bit Tiered Compilers
TOTAL-COMPILE-TIME 451554(ms)
------------------------------------------------------------------------------------------------------------------------------------
GARBAGE-COLLECTORS
------------------------------------------------------------------------------------------------------------------------------------
ParNew 4524/113084(ms)
[count/time]
ConcurrentMarkSweep 3/966(ms)
[count/time]
------------------------------------------------------------------------------------------------------------------------------------
MEMORY-MANAGERS
------------------------------------------------------------------------------------------------------------------------------------
CodeCacheManager Code Cache
Metaspace Manager Metaspace
Compressed Class Space
ParNew Par Eden Space
Par Survivor Space
ConcurrentMarkSweep Par Eden Space
Par Survivor Space
CMS Old Gen
------------------------------------------------------------------------------------------------------------------------------------
MEMORY
------------------------------------------------------------------------------------------------------------------------------------
HEAP-MEMORY-USAGE 1046937600(998.44 MiB)/1073741824(1.00 GiB)/1046937600(998.44 MiB)/433419368(413.34 MiB)
[committed/init/max/used]
NO-HEAP-MEMORY-USAGE 235347968(224.45 MiB)/2555904(2.44 MiB)/-1(-1 B)/227925824(217.37 MiB)
[committed/init/max/used]
PENDING-FINALIZE-COUNT 0
------------------------------------------------------------------------------------------------------------------------------------
OPERATING-SYSTEM
------------------------------------------------------------------------------------------------------------------------------------
OS Linux
ARCH amd64
PROCESSORS-COUNT 2
LOAD-AVERAGE 0.0
VERSION 2.6.32-696.6.3.el6.x86_64
------------------------------------------------------------------------------------------------------------------------------------
THREAD
------------------------------------------------------------------------------------------------------------------------------------
COUNT 1214
DAEMON-COUNT 1099
PEAK-COUNT 1216
STARTED-COUNT 26113
DEADLOCK-COUNT 0
------------------------------------------------------------------------------------------------------------------------------------
FILE-DESCRIPTOR
------------------------------------------------------------------------------------------------------------------------------------
MAX-FILE-DESCRIPTOR-COUNT 65535
OPEN-FILE-DESCRIPTOR-COUNT 510
Affect(row-cnt:0) cost in 30 ms.
sm查看已加载类的方法信息,“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息,sm 命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到,sm+类的全路径名称是查看该类的所有方法信息。
$ sm ****.*****
jad 反编译指定已加载类的源码,jad 命令将 JVM 中实际运行的 class 的 byte code 反编译成 java 代码,便于你理解业务逻辑,jad+类的全路径名称是查看该类的源码信息。
$ jad ****.***
cat打印文件内容,和linux里的cat命令类似,cat+文件名。
$ cat ./logs/manager.2019-08-11.log
Aug 11, 2019 7:17:36 PM org.apache.catalina.core.ApplicationContext log
INFO: Manager: init: Associated with Deployer 'Catalina:type=Deployer,host=localhost'
Aug 11, 2019 7:17:36 PM org.apache.catalina.core.ApplicationContext log
INFO: Manager: init: Global resources are available
Aug 11, 2019 7:17:36 PM org.apache.catalina.core.ApplicationContext log
INFO: Manager: list: Listing contexts for virtual host 'localhost'
Aug 11, 2019 7:17:36 PM org.apache.catalina.core.ApplicationContext log
INFO: Manager: list: Listing contexts for virtual host 'localhost'
classloader+类的全路径名称是查看
$ classloader *****.****
name numberOfInstances loadedCountTotal
org.apache.catalina.loader.WebappClassLoader 2 12673
com.taobao.arthas.agent.ArthasClassloader 5 8265
BootstrapClassLoader 1 3440
sun.reflect.DelegatingClassLoader 1143 1143
org.apache.catalina.loader.StandardClassLoader 1 805
sun.misc.Launcher$ExtClassLoader 1 36
sun.misc.Launcher$AppClassLoader 1 26
com.alibaba.fastjson.util.ASMClassLoader 1 5
org.apache.jasper.servlet.JasperLoader 1 1
通过getstatic命令可以方便的查看类的静态属性。使用方法为getstatic class_name field_name,getstatic + 类的全路径名称 + 被定义的静态名称 :
$ getstatic ****.impl.**** logger
field: logger
@Logger[
serialVersionUID=@Long[5454405123156820674],
FQCN=@String[ch.qos.logback.classic.Logger],
name=@String[****.impl.*****],
level=null,
effectiveLevelInt=@Integer[20000],
parent=@Logger[Logger[***.impl]],
childrenList=null,
aai=null,
additive=@Boolean[true],
loggerContext=@LoggerContext[ch.qos.logback.classic.LoggerContext[default]],
]
Affect(row-cnt:1) cost in 43 ms
sysenv 查看JVM的环境变量信息
$ sysprop
KEY VALUE
------------------------------------------------------------------------------------------------------------------------------------
java.vendor Oracle Corporation
sun.java.launcher SUN_STANDARD
catalina.base /app/tomcat-8080
sun.management.compiler HotSpot 64-Bit Tiered Compilers
sun.nio.ch.bugLevel
catalina.useNaming true
os.name Linux
dubbo.application.logger slf4j
sun.boot.class.path /alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/resources.jar:/alidata1/java-1.8.0-openjd
k-1.8.0.91-1.b14.el6.x86_64/jre/lib/rt.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/li
b/sunrsasign.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/jsse.jar:/alidata1/java-
1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/jce.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.
x86_64/jre/lib/charsets.jar:/alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/jfr.jar:/alid
ata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/classes
java.util.logging.config /app/tomcat-8080/conf/logging.properties
.file
java.vm.specification.ve Oracle Corporation
ndor
java.runtime.version 1.8.0_91-b14
user.name admin
shared.loader
tomcat.util.buf.StringCa true
che.byte.enabled
user.language en
java.naming.factory.init org.apache.naming.java.javaURLContextFactory
ial
sun.boot.library.path /alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/amd64
java.version 1.8.0_91
java.util.logging.manage org.apache.juli.ClassLoaderLogManager
r
user.timezone Asia/Shanghai
sun.arch.data.model 64
java.endorsed.dirs /app/tomcat-8080/endorsed
sun.cpu.isalist
sun.jnu.encoding UTF-8
file.encoding.pkg sun.io
package.access sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.naming.resources.,org.apache.
tomcat.
file.separator /
java.specification.name Java Platform API Specification
JM.LOG.PATH /home/admin/logs
java.class.version 52.0
user.country US
java.home /alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre
java.vm.info mixed mode
os.version 2.6.32-696.6.3.el6.x86_64
path.separator :
java.vm.version 25.91-b14
jboss.i18n.generate-prox true
ies
java.awt.printerjob sun.print.PSPrinterJob
sun.io.unicode.encoding UnicodeLittle
tomcat.util.scan.Default bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,annotations-api.jar,el-api.jar,jsp-api.jar,servlet-api.
JarScanner.jarsToSkip jar,websocket-api.jar,catalina.jar,catalina-ant.jar,catalina-ha.jar,catalina-tribes.jar,jasper.jar,jaspe
r-el.jar,ecj-*.jar,tomcat-api.jar,tomcat-util.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-jni.jar,tomca
t-spdy.jar,tomcat-i18n-en.jar,tomcat-i18n-es.jar,tomcat-i18n-fr.jar,tomcat-i18n-ja.jar,tomcat-juli-adapt
ers.jar,catalina-jmx-remote.jar,catalina-ws.jar,tomcat-jdbc.jar,tools.jar,commons-beanutils*.jar,commons
-codec*.jar,commons-collections*.jar,commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,com
mons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,commons-math*.jar,commons-po
ol*.jar,jstl.jar,taglibs-standard-spec-*.jar,geronimo-spec-jaxrpc*.jar,wsdl4j*.jar,ant.jar,ant-junit*.ja
r,aspectj*.jar,jmx.jar,h2*.jar,hibernate*.jar,httpclient*.jar,jmx-tools.jar,jta*.jar,log4j.jar,log4j-1*.
jar,mail*.jar,slf4j*.jar,xercesImpl.jar,xmlParserAPIs.jar,xml-apis.jar,junit.jar,junit-*.jar,hamcrest*.j
ar,org.hamcrest*.jar,ant-launcher.jar,cobertura-*.jar,asm-*.jar,dom4j-*.jar,icu4j-*.jar,jaxen-*.jar,jdom
-*.jar,jetty-*.jar,oro-*.jar,servlet-api-*.jar,tagsoup-*.jar,xmlParserAPIs-*.jar,xom-*.jar
awt.toolkit sun.awt.X11.XToolkit
package.definition sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.naming.,org.apache.tomc
at.
java.naming.factory.url. org.apache.naming
pkgs
user.home /home/admin
sun.rmi.transport.tcp.re 5000
sponseTimeout
org.apache.catalina.star
tup.ContextConfig.jarsTo
Skip
java.specification.vendo Oracle Corporation
r
java.library.path :/app/tomcat-8080/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.vendor.url http://java.oracle.com/
org.apache.catalina.star tomcat7-websocket.jar
tup.TldConfig.jarsToSkip
java.vm.vendor Oracle Corporation
common.loader ${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
java.runtime.name OpenJDK Runtime Environment
sun.java.command org.apache.catalina.startup.Bootstrap start
java.class.path /app/tomcat-8080/bin/bootstrap.jar:/app/tomcat-8080/bin/tomcat-juli.jar
java.vm.specification.na Java Virtual Machine Specification
me
java.vm.specification.ve 1.8
rsion
catalina.home /app/tomcat-8080
sun.cpu.endian little
sun.os.patch.level unknown
java.io.tmpdir /app/tomcat-8080/temp
java.vendor.url.bug http://bugreport.sun.com/bugreport/
server.loader
os.arch amd64
java.awt.graphicsenv sun.awt.X11GraphicsEnvironment
java.ext.dirs /alidata1/java-1.8.0-openjdk-1.8.0.91-1.b14.el6.x86_64/jre/lib/ext:/usr/java/packages/lib/ext
user.dir /alidata1/app/tomcat-8080
line.separator
java.vm.name OpenJDK 64-Bit Server VM
file.encoding UTF-8
java.specification.versi 1.8
trace方法内部调用路径,并输出方法路径上的每个节点上耗时,trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。使用方式:trace + 类的全路径+方法名。
$ trace ****.impl.**** ***
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 430 ms.
`---ts=2019-08-19 14:29:26;thread_name=DubboServerHandler-10.**.**.***:20916-thread-346;id=20b;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.WebappClassLoader@5024d98
`---[10.560424ms] *****.impl.*****:****()
+---[0.022867ms] java.lang.String:equals() #903
+---[1.173551ms] ******.****:*****() #907
+---[0.015623ms] ******.****:*****() #911
+---[0.011529ms] ******.****:*****() #911
+---[0.006332ms] ******.****:*****() #912
+---[0.003549ms] java.lang.Long:longValue() #912
+---[0.003404ms] java.util.Date:<init>() #912
+---[0.002756ms] java.util.Date:getTime() #912
+---[0.002564ms] java.lang.Long:longValue() #914
`---[8.906082ms] ******.****:*****()#914
watch 能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,使用方式watch + 类的全路径名 + 方法名 + -e -x 2 "{params,returnObj}"
$ watch ***.api.impl.*** *** -e -x 2 "{params,returnObj}"
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 400 ms.
ts=2019-08-19 14:24:48; [cost=0.960088ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:48; [cost=0.918596ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:49; [cost=0.892789ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:49; [cost=0.969515ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:49; [cost=0.688592ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:49; [cost=0.665531ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:50; [cost=1.014832ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:50; [cost=1.021643ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:50; [cost=0.612249ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
]
ts=2019-08-19 14:24:52; [cost=0.834942ms] result=@ArrayList[
@Object[][
@String[2aab56fe09bd280c29facca91efec9ca],
],
null,
tt方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测watch 虽然很方便和灵活,但需要提前想清楚观察表达式的拼写,这对排查问题而言要求太高,因为很多时候我们并不清楚问题出自于何方,只能靠蛛丝马迹进行猜测。这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。
$ tt -t ***.impl.*** ****
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 397 ms.
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
------------------------------------------------------------------------------------------------------------------------------------
1000 2019-08-19 14:37:27 4.86006 true false 0x375768e0 **** *****
1001 2019-08-19 14:37:28 0.167032 false true 0x375768e0 **** *****
1002 2019-08-19 14:37:38 9.571157 true false 0x375768e0 **** *****
$ monitor ****.impl.**** ****
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 453 ms.
timestamp class method total success fail avg-rt(ms)
----------------------------------------------------------------------------------------------------------------------------------
2019-08-19 14:45:09 ***** ***** 17 6 11 3.76
stack 输出当前方法被调用的调用路径
很多时候我们都知道一个方法被执行,但这个方法被执行的路径非常多,或者你根本就不知道这个方法是从那里被执行了,此时你需要的是 stack 命令。
$ stack ****.impl.*** ***
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 400 ms.
ts=2019-08-19 14:48:55;thread_name=DubboServerHandler-10.25.23.152:20916-thread-160;id=14a;is_daemon=true;priority=5;TCCL=org.apache.catalina.loader.WebappClassLoader@5024d98
@com.alibaba.dubbo.common.bytecode.Wrapper28.invokeMethod()
at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
at ***.***.***.***.***.***.api.filter.DubboApiFilter.invoke(DubboApiFilter.java:14)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:65)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.***.***.***.filter.tracking.TrackingProviderFilter.invoke(TrackingProviderFilter.java:47)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.***.***.***.filter.cat.CatProviderFilter.invoke(CatProviderFilter.java:81)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:70)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:132)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:113)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
基础命令
- 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]——查看类的静态属性
- [ognl]——执行ognl表达式
- [mbean]——查看 Mbean 的信息
class/classloader相关
- [sc]——查看JVM已加载的类信息
- [sm]——查看已加载类的方法信息
- [jad]——反编译指定已加载类的源码
- [mc]——内存编绎器,内存编绎文件
- [redefine]——加载外部的文件,redefine到JVM里
- [dump]——dump 已加载类的 byte code 到特定目录
- [classloader]——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 命令。
- [monitor]——方法执行监控
- [watch]——方法执行数据观测
- [trace]——方法内部调用路径,并输出方法路径上的每个节点上耗时
- [stack]——输出当前方法被调用的调用路径
- [tt]——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
options
- [options]——查看或设置Arthas全局开关
管道
Arthas支持使用管道对上述命令的结果进行进一步的处理,如
- grep——搜索满足条件的结果
- plaintext——将命令的结果去除ANSI颜色
- wc——按行统计输出结果
后台异步任务
当线上出现偶发的问题,比如需要watch某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了,详情请参考这里
- 使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session断开不影响任务执行(生命周期默认为1天)
- jobs——列出所有job
- kill——强制终止任务
- fg——将暂停的任务拉到前台执行
- bg——将暂停的任务放到后台执行