JVM第十节GC调优基础-工具篇

 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

java -jar arthas-boot.jar
 
启动 arthas jar 包是 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 类全路径名 方法名

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值