9. 工具包
1. JVM 自带工具
1.1. jps
1.2. jstack
1.3. jmap
1.4. jcmd
1.5. jinfo
1.6. jprofiler
1.7. jvisualvm
jcmd jmap jinfo pid // jstack pid // 查看当前 jvm 有哪些进程,初步排查线程健康状况,如果多数线程处于等待状态,很可能就有问题了 jstat -gc pid // GC 回收情况 jps -l
- 把堆内存 dump 下载 jps //查看 pid jmap -dump:format=b,file=heap.1 pid //不进行垃圾回收直接 dump jmap -dump:live,format=b,file=heap.2 pid //进行 fgc 垃圾回收在进行 dump jmap -histo:live pid //进行 fgc 垃圾回收在进行 dump
- 使用 java VisualVM(lib 目录下 jdk8 自带)导入 dump 文件
2. 第三方工具
- Arhtas
- 通过 Arthas Trace 命令将接口性能优化十倍(User Case 投稿)
- 动态追踪技术漫谈
- 利用 Arthas 精准定位 Java 应用 CPU 负载过高问题
- 阿里 Java 诊断工具 arthas - 排查线上环境内存使用过大、线程 cpu 使用率高问题
- 【死磕 JVM】用 Arthas 排查 JVM 内存 真爽!我从小用到大
arthas 使用
3. 安装
4. 启动
java -jar arthas-boot.jar
5. 常用命令
- dashboard
- thread -b
- jvm
- heapdum /path/to/hproffile/my.hprof
6. 常用场景
- 查看 jvm 参数
- 查看阻塞的线程
- 生成堆栈快照文件
- 查看仪表盘
- 查看类加载信息
- 在线更换.class 文件
- 项目启动时,查看各个区域所使用的比例,来判断各个参数的配置应该是多少
7. 控制面板
发送请求,发现 『ps_old_gen』 区域的使用容量越来越大,如下面两张图,这说明有很多大对象进入了老年代。
8. 利用 Arthas 生成 dump 文件
9. Arthas 的其他命./ch09-tools/image/1680439460507.png
运行
选取一个应用进行链接
查看仪表盘
java[arthas@41713]$ dashboard
txt
[arthas@47132]$ jvm
RUNTIME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MACHINE-NAME 47132@ShawndeMacBook-Pro.local
JVM-START-TIME 2023-04-02 21:28:43
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 Azul Systems, Inc.
VM-VERSION 25.282-b08
INPUT-ARGUMENTS -Xms100m
-Xmx100m
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/shawnwang/Downloads/jvm-logs
-XX:ErrorFile=/Users/shawnwang/Downloads/jvm-logs/java_err.log
-Xloggc:/Users/shawnwang/Downloads/jvm-logs/gc.log
CLASS-PATH jvm-test-0.0.1-SNAPSHOT.jar
BOOT-CLASS-PATH /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/Jav
aVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachin
es/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Con
tents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/classes
LIBRARY-PATH /Users/shawnwang/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CLASS-LOADING
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LOADED-CLASS-COUNT 8164
TOTAL-LOADED-CLASS-COUNT 8164
UNLOADED-CLASS-COUNT 0
IS-VERBOSE false
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COMPILATION
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NAME HotSpot 64-Bit Tiered Compilers
TOTAL-COMPILE-TIME 3537
[time (ms)]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GARBAGE-COLLECTORS
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PS Scavenge name : PS Scavenge
[count/time (ms)] collectionCount : 16
collectionTime : 36
PS MarkSweep name : PS MarkSweep
[count/time (ms)] collectionCount : 2
collectionTime : 61
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MEMORY-MANAGERS
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CodeCacheManager Code Cache
Metaspace Manager Metaspace
Compressed Class Space
PS Scavenge PS Eden Space
PS Survivor Space
PS MarkSweep PS Eden Space
PS Survivor Space
PS Old Gen
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MEMORY
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
HEAP-MEMORY-USAGE init : 109051904(104.0 MiB)
[memory in bytes] used : 33169048(31.6 MiB)
committed : 95420416(91.0 MiB)
max : 96993280(92.5 MiB)
NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
[memory in bytes] used : 59594664(56.8 MiB)
committed : 63012864(60.1 MiB)
max : -1(-1 B)
PENDING-FINALIZE-COUNT 0
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATING-SYSTEM
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OS Mac OS X
ARCH aarch64
PROCESSORS-COUNT 8
LOAD-AVERAGE 2.14892578125
VERSION 13.0.1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
THREAD
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COUNT 30
DAEMON-COUNT 26
PEAK-COUNT 30
STARTED-COUNT 35
DEADLOCK-COUNT 0
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FILE-DESCRIPTOR
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MAX-FILE-DESCRIPTOR-COUNT 10240
OPEN-FILE-DESCRIPTOR-COUNT 202
使用不同参数启动
txt
java -server -Xms100m -Xmx100m -verbose:gc -XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/Users/shawnwang/Downloads/jvm-logs \
-XX:ErrorFile=/Users/shawnwang/Downloads/jvm-logs/java_err.log \
-XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 \
-Xloggc:/Users/shawnwang/Downloads/jvm-logs/gc.log \
-jar jvm-test-0.0.1-SNAPSHOT.jar
txt
[arthas@46428]$ jvm
RUNTIME
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MACHINE-NAME 46428@ShawndeMacBook-Pro.local
JVM-START-TIME 2023-04-02 21:19:08
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 Azul Systems, Inc.
VM-VERSION 25.282-b08
INPUT-ARGUMENTS -Xms100m
-Xmx100m
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/Users/shawnwang/Downloads/jvm-logs
-XX:ErrorFile=/Users/shawnwang/Downloads/jvm-logs/java_err.log
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:SurvivorRatio=8
-Xloggc:/Users/shawnwang/Downloads/jvm-logs/gc.log
CLASS-PATH jvm-test-0.0.1-SNAPSHOT.jar
BOOT-CLASS-PATH /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/Jav
aVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachin
es/zulu-8.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Con
tents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/classes
LIBRARY-PATH /Users/shawnwang/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CLASS-LOADING
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LOADED-CLASS-COUNT 8783
TOTAL-LOADED-CLASS-COUNT 8791
UNLOADED-CLASS-COUNT 8
IS-VERBOSE false
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COMPILATION
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NAME HotSpot 64-Bit Tiered Compilers
TOTAL-COMPILE-TIME 5532
[time (ms)]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GARBAGE-COLLECTORS
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
G1 Young Generation name : G1 Young Generation
[count/time (ms)] collectionCount : 8
collectionTime : 50
G1 Old Generation name : G1 Old Generation
[count/time (ms)] collectionCount : 0
collectionTime : 0
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MEMORY-MANAGERS
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CodeCacheManager Code Cache
Metaspace Manager Metaspace
Compressed Class Space
G1 Young Generation G1 Eden Space
G1 Survivor Space
G1 Old Gen
G1 Old Generation G1 Eden Space
G1 Survivor Space
G1 Old Gen
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MEMORY
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
HEAP-MEMORY-USAGE init : 109051904(104.0 MiB)
[memory in bytes] used : 55500944(52.9 MiB)
committed : 109051904(104.0 MiB)
max : 109051904(104.0 MiB)
NO-HEAP-MEMORY-USAGE init : 2555904(2.4 MiB)
[memory in bytes] used : 68178360(65.0 MiB)
committed : 71303168(68.0 MiB)
max : -1(-1 B)
PENDING-FINALIZE-COUNT 0
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OPERATING-SYSTEM
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OS Mac OS X
ARCH aarch64
PROCESSORS-COUNT 8
LOAD-AVERAGE 1.33984375
VERSION 13.0.1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
THREAD
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
COUNT 45
DAEMON-COUNT 41
PEAK-COUNT 46
STARTED-COUNT 53
DEADLOCK-COUNT 0
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FILE-DESCRIPTOR
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MAX-FILE-DESCRIPTOR-COUNT 10240
OPEN-FILE-DESCRIPTOR-COUNT 202
txt
$ 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
10. Arthas 场景应用
- 获取 jvm 启动时所设置的参数
- 监控 thread 的运行情况
- 监控内存的运行情况
- 生成 dump 文件
- 动态替换.class 文件,达到不停机式投产
11. 常见案例
字节码
- idea 配合插件查询字节码
- 使用 jol 工具查看对象的内存结构
下载命令行 jar ,jol-cli-$version-full.jar
java
// HashMap ////////////////////////////////////////////////////////////////////////////////
$ java -jar jol-cli.jar internals java.util.HashMap
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Instantiated the sample instance via default constructor.
java.util.HashMap object internals:
OFF SZ TYPE DESCRIPTION VALUE
0 8 (object header: mark) 0x0000000000000005 (biasable; age: 0)
8 4 (object header: class) 0x00019828
12 4 java.util.Set AbstractMap.keySet null
16 4 java.util.Collection AbstractMap.values null
20 4 int HashMap.size 0
24 4 int HashMap.modCount 0
28 4 int HashMap.threshold 0
32 4 float HashMap.loadFactor 0.75
36 4 java.util.HashMap.Node[] HashMap.table null
40 4 java.util.Set HashMap.entrySet null
44 4 (object alignment gap)
Instance size: 48 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
// String ////////////////////////////////////////////////////////////////////////////////
$ java -jar jol-cli.jar externals java.lang.String
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Instantiated the sample instance via default constructor.
java.lang.String@64cee07d object externals:
ADDRESS SIZE TYPE PATH VALUE
58010a600 16 [C .value []
58010a610 8923824 (something else) (somewhere else) (something else)
58098d0c0 24 java.lang.String (object)
Addresses are stable after 1 tries.
// Thread ////////////////////////////////////////////////////////////////////////////////
$ java -jar jol-cli/target/jol-cli.jar footprint java.lang.Thread
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Instantiated the sample instance via default constructor.
java.lang.Thread@64cee07d footprint:
COUNT AVG SUM DESCRIPTION
13 84 1104 [B
496 67 33400 [C
139 23 3272 [Ljava.lang.Class;
17 89 1520 [Ljava.lang.Object;
...
1 24 24 sun.reflect.generics.tree.ClassSignature
3 16 48 sun.reflect.generics.tree.ClassTypeSignature
2 24 48 sun.reflect.generics.tree.FormalTypeParameter
3 24 72 sun.reflect.generics.tree.SimpleClassTypeSignature
2849 200416 (total)