GC调优工具篇
1 JDK提供工具-命令行
主要的命令行工具:
jps : 查询当前机器正在运行的虚拟机进程
1.1 jps-查询进程
localhost:~ wangxinqiao$ jps
13810 Launcher
13811 StopWorld
7468
494 QuorumPeerMain
13855 Jps
可选参数:
-m 输出主函数传入的参数
-l 输出应用程序主类完整package名称或者jar完整名称
-v 列出jvm参数
localhost:~ wangxinqiao$ jps -m
13810 Launcher /Applications/IntelliJ IDEA.app/Contents/lib/plexus-component-annotations-1.6.jar:/Applications/IntelliJ IDEA.app/Contents/lib/asm-all-7.0.1.jar:/Applications/IntelliJ IDEA.app/Contents/lib/aether-api-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/lib/aether-transport-http-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/lib/aether-util-1.1.0.jar:/Applications/IntelliJ IDEA.app/Contents/lib/lz4-1.3.0.jar:/Applications/IntelliJ IDEA.app/Contents/lib/httpcore-4.4.10.jar:/Applications/IntelliJ IDEA.app/Contents/lib/netty-buffer-4.1.32.Final.jar:/Applications/IntelliJ IDEA.app/Contents/lib/guava-25.1-jre.jar:/Applications/IntelliJ IDEA.app/Contents/lib/netty-transport-4.1.32.Final.jar:/Applications/IntelliJ IDEA.app/Contents/lib/util.jar:/Applications/IntelliJ IDEA.app/Contents/lib/platform-api.jar:/Applications/IntelliJ IDEA.app/Contents/lib/plexus-interpolation-1.21.jar:/Applications/IntelliJ IDEA.app/Contents/lib/aether-spi-1.1.0.jar:/Applications/IntelliJ IDEA.app/Cont
13811 StopWorld
15268 Jps -m
7468
494 QuorumPeerMain /usr/local/etc/zookeeper/zoo.cfg
localhost:~ wangxinqiao$ jps -l
15361 sun.tools.jps.Jps
13810 org.jetbrains.jps.cmdline.Launcher
13811 ex10.StopWorld
7468
494 org.apache.zookeeper.server.quorum.QuorumPeerMain
localhost:~ wangxinqiao$ jps -v
13810 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/Users/wangxinqiao/Documents/享学/01JVM/20200806GC调优基础知识之工具篇/20.8.6代码&工具&PPT/第十节课/案例代码/ref-jvm3 -Dpreload.config.path=/Users/wangxinqiao/Library/Preferences/IntelliJIdea2019.1/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-7563232854925044562 -Dfile.encoding=UTF-8 -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IntelliJIdea2019.1 -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.config.path=/Users/wangxinqiao/Library/Preferences/IntelliJIdea2019.1 -Didea.plugins.path=/Users/wangxinqiao/Library/Application Support/IntelliJIdea2019.1 -Djps.log.dir=/Users/wangxinqiao/Library/Logs/IntelliJIdea2019.1/build-log -Djps.fallback.jdk.home=/Applications/IntelliJ IDEA.app/Contents/jdk/Contents/Home/jre -Djps.fallback.jdk.version=1.8.0_212-release -D
13811 StopWorld -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=50839:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8
15403 Jps -Denv.class.path=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/lib:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib: -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home -Xms8m
7468 -Xms128m -Xmx2000m -XX:ReservedCodeCacheSize=240m -XX:+UseCompressedOops -Dfile.encoding=UTF-8 -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Xverify:none -XX:ErrorFile=/Users/wangxinqiao/java_error_in_idea_%p.log -XX:HeapDumpPath=/Users/wangxinqiao/java_error_in_idea.hprof -javaagent:/Users/wangxinqiao/Downloads/jetbrains-agent.jar -Djb.vmOptionsFile=/Users/wangxinqiao/Library/Preferences/IntelliJIdea2019.1/idea.vmoptions -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.executable=idea -Didea.paths.selector=IntelliJIdea2019.1
494 QuorumPeerMain -Dzookeeper.log.dir=/usr/local/Cellar/zookeeper/3.5.8/libexec/bin/../logs -Dzookeeper.log.file=zookeeper-wangxinqiao-server-localhost.log -Dzookeeper.root.logger=INFO,CONSOLE -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=kill -9 %p -Xmx1000m -Dapple.awt.UIElement=true -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false
localhost:~ wangxinqiao$
1.2 jstat-查询虚拟机运行状态
首先用jps查询出要查询虚拟机状态的pid-进程号
localhost:~ wangxinqiao$ jps
13810 Launcher
13811 StopWorld
17029 Jps
7468
494 QuorumPeerMain
localhost:~ wangxinqiao$ jstat -gc 13811
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
232960.0 232960.0 0.0 150112.0 232960.0 205014.2 1398272.0 792528.9 4864.0 3568.7 512.0 397.5 81 9.285 25 9.062 18.346
localhost:~ wangxinqiao$ jstat -class 13811
Loaded Bytes Unloaded Bytes Time
588 1182.7 0 0.0 0.17
localhost:~ wangxinqiao$
这个通过连续查看,可以看出YGC(年轻带垃圾回收次数),发生了变化,说明发生了垃圾回收。
1.3 jinfo-查看和修改虚拟机参数
jinfo -flags pid 显示虚拟机参数
localhost:~ wangxinqiao$ jinfo -flags 13811
Attaching to process ID 13811, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.51-b03
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2147483648 -XX:MaxNewSize=715653120 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=50839:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8
localhost:~ wangxinqiao$
jinfo -flag PrintGC pid 查看jvm参数值
localhost:~ wangxinqiao$ jinfo -flag PrintGC 13811
-XX:-PrintGC
jinfo -flag +PrintGC pid 修改jvm参数值
localhost:~ wangxinqiao$ jinfo -flag +PrintGC 13811
localhost:~ wangxinqiao$ jinfo -flag PrintGC 13811
-XX:+PrintGC
控制台已经打印GC日志
1.4 jmap-生成堆转储快照
jmap -heap pid -显示堆heap信息
localhost:~ wangxinqiao$ jmap -heap 13811
Attaching to process ID 13811, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.51-b03
using thread-local object allocation.
Parallel GC with 4 thread(s)
#堆配置情况
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 44564480 (42.5MB)
MaxNewSize = 715653120 (682.5MB)
OldSize = 89653248 (85.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
#堆heap实际使用情况
Heap Usage:
PS Young Generation
Eden Space:
capacity = 238551040 (227.5MB)
used = 85882344 (81.9037857055664MB)
free = 152668696 (145.5962142944336MB)
36.001664046402816% used
From Space:
capacity = 238551040 (227.5MB)
used = 238551040 (227.5MB)
free = 0 (0.0MB)
100.0% used
To Space:
capacity = 238551040 (227.5MB)
used = 0 (0.0MB)
free = 238551040 (227.5MB)
0.0% used
PS Old Generation
capacity = 1431830528 (1365.5MB)
used = 815770512 (777.9793853759766MB)
free = 616060016 (587.5206146240234MB)
56.973957186083965% used
2076 interned Strings occupying 147040 bytes.
localhost:~ wangxinqiao$
f
jmap -histo pid 打印进程实例数量及实例占用的空间大小,查看哪些对象占内存
localhost:~ wangxinqiao$ jmap -histo 13811
num #instances #bytes class name
----------------------------------------------
1: 1613415 851792416 [B
2: 1613072 38713728 java.util.LinkedList$Node
3: 7638 4523888 [I
4: 3325 264296 [C
5: 3297 79128 java.lang.String
6: 671 76296 java.lang.Class
7: 633 37984 [Ljava.lang.Object;
8: 369 11808 java.util.HashMap$Node
9: 99 6336 java.net.URL
jmap -histo:live pid 打印进程存活实例数量及实例占用的空间大小
jmap -histo 13811 | head -5 打印进程排名前5的实例数量及实例占用的空间大小
localhost:~ wangxinqiao$ jmap -histo 13811 | head -5
num #instances #bytes class name
----------------------------------------------
1: 1527747 806559712 [B
2: 95609 44295816 [I
jmap -dump:live,format=b,file=wangxinqiao.bin pid 转存文件
localhost:~ wangxinqiao$ jmap -dump:live,format=b,file=wangxinqiao.bin 13811
Dumping heap to /Users/wangxinqiao/wangxinqiao.bin ...
Heap dump file created
1.5 jstack-线程快照信息
jstack pid 查看线程信息
jstack 最大作用是排除死锁,死锁占用资源
1.6 总结
生产服务器如果够用,则推荐开启-XX:-HeapDumpOnOutOfMemoryError,当出现OOM时,输出dump文件,记录当时堆内存快照。
调优之前开启,调优之后关闭:-XX:+PrintGC, -XX:+PrintGCDetails,-XX:+PrintGCTimeStamps,-Xlogger:logpath
考虑使用:-XX:+PrintHeapAtGC,-XX:+TraceClassLoading
2 Arthas-阿里
官方文档参考 https://alibaba.github.io/arthas/
2.1 下载和安装
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
2.2常用命令
2.2.0 arthas 命令汇总
2.2.1 dashboard
2.2.2 thread-线程相关
thread -n 3 最忙的前n个进程
thread -b 找出阻塞当前线程的线程
2.2.3 jad-反编译,指定已加载的类
jad 路径名
2.2.4 trace-方法调用显示耗时
trace 类全路径名 方法名
2.2.4 monitor-监控方法使用情况
monitor -c 5 类全路径名 方法名