执行成功后, arthas提供了一种命令行方式的交互方式, arthas会检测当前服务器上的Javai程,并将进程列表展示出来,用户输入对应的编号(1.2.3.4.)进行选择,然后回车。
启动退出的方式
启动方式
方式1:
java -jar arthas-boot.jar
#选择进程(输入[]内编写(不是PID)回车)
[INFO] arthas-boot version: 3.1.4
INFO1 Found existing java process, please choose one and hit RETURN.
*[1]: 11616 com.Arthas
[2]: 8676
[3]: 16200 org.jetbrains.jps.cmdline. Launcher
[41: 21832 org.jetbrains.idea. maven. server. RemoteMavenServer
方式2:运行时选择Java进程PID
java -jar arthas-boot.jar [PID]
退出
quit
指令
基础指令
- help——查看命令帮助信息
- cat——打印文件内容,和linux里的cat命令类似
- echo–打印参数,和linux里的echo命令类似
- grep——匹配查找,和linux里的grep命令类似
- base64——base64编码转换,和linux里的base64命令类似
- tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
- pwd——返回当前的工作目录,和linux命令类似
- cls——清空当前屏幕区域
- session——查看当前会话的信息
- reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- version——输出当前目标 Java 进程所加载的 Arthas 版本号
- history——打印命令历史
- quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
JVM相关
dashboard:查看实时数据面板
参数说明
参数名称 | 参数说明 |
---|---|
[i:] | 刷新实时数据的时间间隔 (ms),默认5000ms |
[n:] | 刷新实时数据的次数 |
使用
dashboard -i 30000
通过图中的thread区域可以看出当前占用cpu最高的两个是jvm内部线程
数据说明
- ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应。
- NAME: 线程名
- GROUP: 线程组名
- PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高
- STATE: 线程的状态
- CPU%: 线程的cpu使用率。比如采样间隔1000ms,某个线程的增量cpu时间为100ms,则cpu使用率=100/1000=10%
- DELTA_TIME: 上次采样之后线程运行增量CPU时间,数据格式为秒
- TIME: 线程运行总CPU时间,数据格式为分:秒
- INTERRUPTED: 线程当前的中断位状态
- DAEMON: 是否是daemon线程
- usage:内存使用的百分比
JVM内部线程
Java 8之后支持获取JVM内部线程CPU时间,这些线程只有名称和CPU时间,没有ID及状态等信息(显示ID为-1)。 通过内部线程可以观测到JVM活动,如GC、JIT编译等占用CPU情况,方便了解JVM整体运行状况。
- 当JVM 堆(heap)/元数据(metaspace)空间不足或OOM时,可以看到GC线程的CPU占用率明显高于其他的线程。
- 当执行trace/watch/tt/redefine等命令后,可以看到JIT线程活动变得更频繁。因为JVM热更新class字节码时清除了此class相关的JIT编译结果,需要重新编译。
JVM内部线程包括下面几种:
- JIT编译线程: 如 C1 CompilerThread0, C2 CompilerThread0
- GC线程: 如GC Thread0, G1 Young RemSet Sampling
- 其它内部线程: 如VM Periodic Task Thread, VM Thread, Service Thread
thread:查看当前线程信息,查看线程的堆栈
参数说明
参数名称 | 参数说明 |
---|---|
id | 线程id |
[n:] | 指定最忙的前N个线程并打印堆栈 |
[b] | 找出当前阻塞其他线程的线程 |
[i ] |
指定cpu使用率统计的采样间隔,单位为毫秒,默认值为200 |
[--all] | 显示所有匹配的线程 |
使用参考
展示当前最忙的前N个线程并打印堆栈
[arthas@10069]$ thread -n 4
"sentinel-time-tick-thread" Id=62 cpuUsage=0.91% deltaTime=1ms time=2176ms TIMED_WAITING
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.alibaba.csp.sentinel.util.TimeUtil$1.run(TimeUtil.java:37)
at java.lang.Thread.run(Thread.java:748)
"C1 CompilerThread1" [Internal] cpuUsage=0.34% deltaTime=0ms time=2273ms
"arthas-command-execute" Id=58 cpuUsage=0.15% deltaTime=0ms time=7ms RUNNABLE
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:461)
at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:206)
at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms
- 没有线程ID,包含
[Internal]
表示为JVM内部线程,如第13行。 -
cpuUsage
为采样间隔时间内线程的CPU使用率。 -
deltaTime
为采样间隔时间内线程的增量CPU时间,小于1ms时被取整显示为0ms。 -
time
线程运行总CPU时间。
注意:线程栈为第二采样结束时获取,不能表明采样间隔时间内该线程都是在处理相同的任务。建议间隔时间不要太长,可能间隔时间越大越不准确。 可以根据具体情况尝试指定不同的间隔时间,观察输出结果。
当没有参数时,显示第一页线程的信息
默认按照CPU增量时间降序排列,只显示第一页数据,默认按照CPU增量时间降序排列。
[arthas@26605]$ thread
Threads Total: 45, NEW: 0, RUNNABLE: 18, BLOCKED: 0, WAITING: 15, TIMED_WAITING: 7, TERMINATED: 0, Internal threads: 5
ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
-1 C1 CompilerThread1 - -1 - 0.35 0.000 0:1.559 false true
57 arthas-command-execute system 5 RUNNABLE 0.15 0.000 0:0.014 false true
25 sentinel-dashboard-metrics-fetch-task-thre main 5 TIMED_WAITING 0.06 0.000 0:0.016 false false
56 arthas-NettyHttpTelnetBootstrap-3-2 system 5 RUNNABLE 0.05 0.000 0:0.105 false true
-1 VM Periodic Task Thread - -1 - 0.04 0.000 0:0.071 false true
28 NioBlockingSelector.BlockPoller-1 main 5 RUNNABLE 0.02 0.000 0:0.005 false true
41 http-nio-8080-AsyncTimeout main 5 TIMED_WAITING 0.02 0.000 0:0.006 false true
39 http-nio-8080-ClientPoller-0 main 5 RUNNABLE 0.02 0.000 0:0.007 false true
-1 C2 CompilerThread0 - -1 - 0.0 0.000 0:4.884 false true
2 Reference Handler system 10 WAITING 0.0 0.000 0:0.007 false true
3 Finalizer system 8 WAITING 0.0 0.000 0:0.014 false true
4 Signal Dispatcher system 9 RUNNABLE 0.0 0.000 0:0.000 false true
44 Attach Listener system 9 RUNNABLE 0.0 0.000 0:0.006 false true
46 arthas-timer system 9 WAITING 0.0 0.000 0:0.000 false true
49 arthas-NettyHttpTelnetBootstrap-3-1 system 5 RUNNABLE 0.0 0.000 0:0.022 false true
50 arthas-NettyWebsocketTtyBootstrap-4-1 system 5 RUNNABLE 0.0 0.000 0:0.000 false true
51 arthas-NettyWebsocketTtyBootstrap-4-2 system 5 RUNNABLE 0.0 0.000 0:0.000 false true
52 arthas-shell-server system 9 TIMED_WAITING 0.0 0.000 0:0.000 false true
53 arthas-session-manager system 9 TIMED_WAITING 0.0 0.000 0:0.000 false true
54 arthas-UserStat system 9 WAITING 0.0 0.000 0:0.000 false true
12 sentinel-command-center-executor-thread-1 main 5 RUNNABLE 0.0 0.000 0:0.000 false false
13 sentinel-heartbeat-send-task-thread-1 main 5 TIMED_WAITING 0.0 0.000 0:0.002 false true
16 sentinel-heartbeat-send-task-thread-2 main 5 WAITING 0.0 0.000 0:0.000 false true
19 ContainerBackgroundProcessor[StandardEngin main 5 TIMED_WAITING 0.0 0.000 0:0.005 false true
20 container-0 main 5 TIMED_WAITING 0.0 0.000 0:0.000 false false
21 pool-1-thread-1 main 5 RUNNABLE 0.0 0.000 0:0.008 false false
22 I/O dispatcher 1 main 5 RUNNABLE 0.0 0.000 0:0.005 false false
23 I/O dispatcher 2 main 5 RUNNABLE 0.0 0.000 0:0.005 false false
24 pool-2-thread-1 main 5 RUNNABLE 0.0 0.000 0:0.004 false false
26 I/O dispatcher 3 main 5 RUNNABLE 0.0 0.000 0:0.004 false false
27 I/O dispatcher 4 main 5 RUNNABLE 0.0 0.000 0:0.003 false false
29 http-nio-8080-exec-1 main 5 WAITING 0.0 0.000 0:0.000 false true
30 http-nio-8080-exec-2 main 5 WAITING 0.0 0.000 0:0.000 false true
31 http-nio-8080-exec-3 main 5 WAITING 0.0 0.000 0:0.000 false true
32 http-nio-8080-exec-4 main 5 WAITING 0.0 0.000 0:0.000 false true
33 http-nio-8080-exec-5 main 5 WAITING 0.0 0.000 0:0.000 false true
34 http-nio-8080-exec-6 main 5 WAITING 0.0 0.000 0:0.000 false true
35 http-nio-8080-exec-7 main 5 WAITING 0.0 0.000 0:0.000 false true
36 http-nio-8080-exec-8 main 5 WAITING 0.0 0.000 0:0.000 false true
[arthas@26605]$
thread –all, 显示所有匹配的线程
显示所有匹配线程信息,有时需要获取全部JVM的线程数据进行分析。
thread id, 显示指定线程的运行堆栈
[arthas@26605]$ thread 12
"sentinel-command-center-executor-thread-1" Id=12 RUNNABLE (in native)
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:560)
at java.net.ServerSocket.accept(ServerSocket.java:528)
at com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter$ServerThread.run(SimpleHttpCommandCenter.java:188)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
thread -b, 找出当前阻塞其他线程的线程
找到阻塞其他线程的线程,即当前占用锁的线程
$ thread -b
"http-bio-8080-exec-4" Id=27 TIMED_WAITING
at java.lang.Thread.sleep(Native Method)
at test.arthas.TestThreadBlocking.doGet(TestThreadBlocking.java:22)
- locked java.lang.Object@725be470 <---- but blocks 4 other threads! //阻塞其他四个线程
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at test.filter.TestDurexFilter.doFilter(TestDurexFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at com.taobao.tomcat.valves.ContextLoadFilterValve$FilterChainAdapter.doFilter(ContextLoadFilterValve.java:191)
at com.taobao.eagleeye.EagleEyeFilter.doFilter(EagleEyeFilter.java:81)
at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:150)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
- locked org.apache.tomcat.util.net.SocketWrapper@7127ee12
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Number of locked synchronizers = 1
- java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e
注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock
, 目前还不支持。
thread -i, 指定采样时间间隔
thread -i 1000 : 统计最近1000ms内的线程CPU时间。
thread -n 3 -i 1000 : 列出1000ms内最忙的3个线程栈
$ thread -n 3 -i 1000
"as-command-execute-daemon" Id=4759 cpuUsage=23% RUNNABLE
at sun.management.ThreadImpl.dumpThreads0(Native Method)
at sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:440)
at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:133)
at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:79)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:96)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:27)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:125)
at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:122)
at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:332)
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:756)
Number of locked synchronizers = 1
- java.util.concurrent.ThreadPoolExecutor$Worker@546aeec1
...
thread –state ,查看指定状态的线程
[arthas@26605]$ thread --state WAITING
Threads Total: 43, NEW: 0, RUNNABLE: 18, BLOCKED: 0, WAITING: 15, TIMED_WAITING: 10, TERMINATED: 0
ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTED DAEMON
2 Reference Handler system 10 WAITING 0.0 0.000 0:0.008 false true
3 Finalizer system 8 WAITING 0.0 0.000 0:0.014 false true
46 arthas-timer system 9 WAITING 0.0 0.000 0:0.000 false true
54 arthas-UserStat system 9 WAITING 0.0 0.000 0:0.000 false true
16 sentinel-heartbeat-send-task-thread-2 main 5 WAITING 0.0 0.000 0:0.001 false true
29 http-nio-8080-exec-1 main 5 WAITING 0.0 0.000 0:0.158 false true
30 http-nio-8080-exec-2 main 5 WAITING 0.0 0.000 0:0.000 false true
31 http-nio-8080-exec-3 main 5 WAITING 0.0 0.000 0:0.000 false true
32 http-nio-8080-exec-4 main 5 WAITING 0.0 0.000 0:0.000 false true
33 http-nio-8080-exec-5 main 5 WAITING 0.0 0.000 0:0.000 false true
34 http-nio-8080-exec-6 main 5 WAITING 0.0 0.000 0:0.000 false true
35 http-nio-8080-exec-7 main 5 WAITING 0.0 0.000 0:0.000 false true
36 http-nio-8080-exec-8 main 5 WAITING 0.0 0.000 0:0.000 false true
37 http-nio-8080-exec-9 main 5 WAITING 0.0 0.000 0:0.000 false true
38 http-nio-8080-exec-10 main 5 WAITING 0.0 0.000 0:0.000 false true
SC:查看JVM已加载的类信息
“Search-Class” 的简写,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息,这个命令支持的参数有 [d]
、[E]
、[f]
和 [x:]
。
参数
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[d] | 输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。 |
如果一个类被多个ClassLoader所加载,则会出现多次 | |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[f] | 输出当前类的成员变量信息(需要配合参数-d一起使用) |
[x:] | 指定输出静态变量时属性的遍历深度,默认为 0,即直接使用 toString 输出 |
[c:] |
指定class的 ClassLoader 的 hashcode |
[classLoaderClass:] |
指定执行表达式的 ClassLoader 的 class name |
[n:] |
具有详细信息的匹配类的最大数量(默认为100) |
- class-pattern支持全限定名,如com.taobao.test.AAA,也支持com/taobao/test/AAA这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把
/
替换为.
啦。 - sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开
options disable-sub-class true
开关
使用参考
模糊搜索
$ sc demo.*
demo.MathGame
Affect(row-cnt:1) cost in 55 ms.
打印类的详细信息
$ sc -d demo.MathGame
class-info demo.MathGame
code-source /private/tmp/math-game.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
Affect(row-cnt:1) cost in 875 ms.
打印出类的Field信息
$ sc -d -f demo.MathGame
class-info demo.MathGame //类信息
code-source /private/tmp/math-game.jar //代码位置
name demo.MathGame //类名
isInterface false //是不是接口
isAnnotation false //是不是注释
isEnum false //是不是枚举
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object //父类
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69 //classloader
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69 //classloader 的hash
fields modifierprivate,static //属性信息
type java.util.Random
name random
value java.util.Random@522b4
08a
modifierprivate
type int
name illegalArgumentCount
Affect(row-cnt:1) cost in 19 ms.
sm:查看已加载类的方法信息
“Search-Method” 的简写,这个命令能搜索出所有已经加载了 Class 信息的方法信息。
sm
命令只能看到由当前类所声明 (declaring) 的方法,父类则无法看到。
sc看类信息,sm可以看类的方法信息,两者正好可以结合者来看。
参数说明
参数名称 | 参数说明 |
---|---|
class-pattern | 类名表达式匹配 |
method-pattern | 方法名表达式匹配 |
[d] | 展示每个方法的详细信息 |
[E] | 开启正则表达式匹配,默认为通配符匹配 |
[c:] |
指定class的 ClassLoader 的 hashcode |
[classLoaderClass:] |
指定执行表达式的 ClassLoader 的 class name |
[n:] |
具有详细信息的匹配类的最大数量(默认为100) |
使用参考
查看类的方法信息
$ sm java.lang.String
java.lang.String->
java.lang.String->equals //前面为返回值 ->后面为方法名
java.lang.String->toString
java.lang.String->hashCode
java.lang.String->compareTo
java.lang.String->indexOf
java.lang.String->valueOf
java.lang.String->checkBounds
java.lang.String->length
java.lang.String->isEmpty
java.lang.String->charAt
java.lang.String->codePointAt
java.lang.String->codePointBefore
java.lang.String->codePointCount
java.lang.String->offsetByCodePoints
java.lang.String->getChars
java.lang.String->getBytes
java.lang.String->contentEquals
java.lang.String->nonSyncContentEquals
java.lang.String->equalsIgnoreCase
java.lang.String->compareToIgnoreCase
java.lang.String->regionMatches
java.lang.String->startsWith
java.lang.String->endsWith
java.lang.String->indexOfSupplementary
java.lang.String->lastIndexOf
java.lang.String->lastIndexOfSupplementary
java.lang.String->substring
java.lang.String->subSequence
java.lang.String->concat
java.lang.String->replace
java.lang.String->matches
java.lang.String->contains
java.lang.String->replaceFirst
java.lang.String->replaceAll
java.lang.String->split
java.lang.String->join
java.lang.String->toLowerCase
java.lang.String->toUpperCase
java.lang.String->trim
java.lang.String->toCharArray
java.lang.String->format
java.lang.String->copyValueOf
java.lang.String->intern
Affect(row-cnt:44) cost in 1342 ms.
查看方法的详细信息
$ sm -d java.lang.String toString
declaring-class java.lang.String
method-name toString
modifier public
annotation
parameters
return java.lang.String
exceptions
Affect(row-cnt:1) cost in 3 ms.
java -jar arthas-boot.jar --tunnel-server ws://172.16.12.95:7777/ws
Arthas 基础命令:
help 查看命令帮助信息
cls 清空当前屏幕区域
session 查看当前会话的信息
reset 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
version 输出当前目标 Java 进程所加载的 Arthas 版本号
history 打印命令历史
quit 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
stop 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
keymap Arthas快捷键列表及自定义快捷键
dashboard 当前系统的实时数据面板
thread 查看当前 JVM 的线程堆栈信息
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
monitor 方法执行监控
jvm 查看当前 JVM 信息
vmoption 查看,更新 JVM 诊断相关的参数
sc 查看 JVM 已加载的类信息
sm 查看已加载类的方法信息
jad 反编译指定已加载类的源码
classloader 查看 classloader 的继承树,urls,类加载信息
heapdump 类似 jmap 命令的 heap dump 功能