深入理解java虚拟机之虚拟机性能监控和故障处理工具

SDK监控和故障处理工具

名称主要作用
jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程
jstatJVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfoConfiguration Info For Java ,显示虚拟机配置信息
jmapMemory map for java,生成虚拟机的内存转储快照(heapdump文件)
jhatJVM Heap Dump Browser,用与分析heapdump文件,它会建立一个http/HTML服务器,让用户可以在浏览器上面查看分析结果
jstackStack Trace For Java,显示虚拟机的线程快照

jdk可视化工具

  • jconsole
    在这里插入图片描述
  • visualVM

HSDIS:JIT生成代码反汇编

jstatck:java栈跟踪工具

jstack命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环等等吧。

  • 命令格式
    jstatck [option] vmid
选项作用
-F当整厂输出的请求不被响应时,强制输出线程堆栈
-l除栈外,显示关于锁的附加信息
-m如果调用到本地方法的话,可以显示c/c++的堆栈
  • Example
[shankai@shankai Desktop]$ jstack -l 1617
2019-03-18 09:28:29
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):

"Attach Listener" #72 daemon prio=9 os_prio=0 tid=0x00007f38e0001000 nid=0x87a waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
	- None

jhat:虚拟机堆转储快照分析工具

与jmap搭配使用,用来分析jmap生成的堆转储快照。

jmap:Java内存映像工具

  • 命令格式
    |选项| 作用 |
    |–|--|
    | -dump | 生成Java堆转储快照 |
    |-finalizerinfo | 显示在F-Queue中等待finalizer执行finalize方法的对象 |
    | -heap | 显示java堆的详细信息,如使用哪种回收器、参数配置、分代状况等等 |
    | -histo | 显示堆中的对象统计信息,包括类、实例数量、合计容量 |
    | -permstat | 以ClassLoader为统计口径显示永久代内存状态 |
    | -F | 当虚拟机进程堆-dump选项没有响应时,可以使用这个选项强制生成dump快照 |
  • Example
[shankai@shankai Desktop]$ jmap -dump:format=b,file=sk.bin 9176
Dumping heap to /home/shankai/Desktop/sk.bin ...
Heap dump file created
[shankai@shankai Desktop]$ head -n 1 sk.bin 
JAVA PROFILE 1.0.i��1�-�X� Editor not initialized in addNotify()t�L��(Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$ObjectRef;Lkotlin/jvm/internal/Ref$ObjectRef;)VB�L��`(Lcom/siyeh/ig/controlflow/IfMayBeConditionalInspection;)VV�LωP(Lcom/siyeh/ig/controlflow/ConditionalCanBePushedInsideExpressionInspection;)V'�H|x@GradleScriptTemplateProvider.kt�E�� calculateCrc�4~1pSmall Text�4E��findUrlAtCaret"�4 BATIK_EXT_COLOR_SWITCH_TAGK�D��(Ljava/security/spec/ECPoint;Ljava/security/spec/ECParameterSpec;)V���CRL_REASON��<�@UnixFileKey.java�D�%�JBuilder.xml3�D��(Ljava/lang/Iterable<Ljava/lang/Double;>;)DI�D�X�(Ljava/io/InputStream;Ljava/nio/charset/Charset;)Ljava/io/Reader;H��"��(Ljava/lang/String;I[Ljava/lang/String;[Ljava/lang/String;[I[I)V���removeSizeHints5�HN���

看jinfo的命令格式,有一个问题,jvm就一套堆栈结构?还是每个进程都有一套堆栈结构???[这是一个问题]

jvm的内存区域,就是方法区什么的就是只有一套还是每个进程都有一套呢???

jinfo:java配置信息工具

jinfo可以实时地查看和调整虚拟机的各项参数。

  • Example
[shankai@shankai Desktop]$ jinfo -flag CMSInitiatingOccupancyFraction 9176
-XX:CMSInitiatingOccupancyFraction=-1

jstat:虚拟机统计信息监视工具

jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

  • jstat命令格式
    jstat option vmid interval count
jstat -gc 2764 250 20
每250ms查询一次进程2764的垃圾收集情况,一共查询20次。
选项作用
-class监视类装载和卸载数量、总空间以及类装载所耗费的时间
-gc监视java堆的状况,包括Eden区,两个survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与-gcutil的功能一样,但是会额外输出导致上一次GC的原因
-gcnew监视新生代gc情况
-gcnewcapacity监视内容与gcnew基本一样,但是主要关注使用到的最大最小空间
-gcold监视老年代gc情况
-gcoldcapacity监视内容与gcold基本一样,但是主要关注使用到的最大最小空间
-gcpermcapacity输出永久代使用的最大、最小空间
-compiler输出JIT编译器编译过的方法、耗时等信息
-printcompilation输出已经被JIT编译的方法
  • Example
[shankai@shankai Desktop]$ jstat -gcutil 9176
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00 100.00  96.90  85.21  95.54  93.85     35    0.495     9    0.106    0.601

新生代Eden区占用了96.9%的空间;
Suvivor0是空的
Survivor1占满;
老年代占用了85.21%的空间;
YGC表示发生了Minor GC 35次;
YGCT表示Minor GC的总耗时是0.495s;
FGC表示Full GC发生了9次;
FGCT表示Full GC的时间是0.106s;
GCT表示GC的时间是0.601s;

JPS:虚拟机进程状况工具

  • jps 命令格式
jps [options] [hostid]
  • options
    - -l 输出主类的全名,如果进程执行的是jar包,输出jar路径
[shankai@shankai Desktop]$ jps -l
4353 Solution68
7986 org.jetbrains.jps.cmdline.Launcher
8646 sun.tools.jps.Jps
1435 com.intellij.idea.Main

- -q 	只输出LVMID,省略主类的名称
[shankai@shankai Desktop]$ jps -q
4353
7986
8715
1435
	-  -m 输出虚拟机进程启动是传递给主类main()函数的参数
[shankai@shankai Desktop]$ jps -m
4353 Solution68
7986 Launcher /usr/share/idea/lib/maven-model-builder-3.3.9.jar:/usr/share/idea/lib/jps-builders-6.jar:/usr/share/idea/lib/maven-aether-provider-3.3.9.jar:/usr/share/idea/lib/commons-codec-1.10.jar:/usr/share/idea/lib/maven-builder-support-3.3.9.jar:/usr/share/idea/lib/jdom.jar:/usr/share/idea/lib/guava-23.6-jre.jar:/usr/share/idea/lib/slf4j-api-1.7.25.jar:/usr/share/idea/lib/maven-model-3.3.9.jar:/usr/share/idea/lib/javac2.jar:/usr/share/idea/lib/httpcore-4.4.9.jar:/usr/share/idea/lib/aether-transport-file-1.1.0.jar:/usr/share/idea/lib/jps-model.jar:/usr/share/idea/lib/plexus-utils-3.0.22.jar:/usr/share/idea/lib/aether-util-1.1.0.jar:/usr/share/idea/lib/platform-api.jar:/usr/share/idea/lib/netty-resolver-4.1.25.Final.jar:/usr/share/idea/lib/netty-codec-4.1.25.Final.jar:/usr/share/idea/lib/aether-spi-1.1.0.jar:/usr/share/idea/lib/aether-impl-1.1.0.jar:/usr/share/idea/lib/commons-lang3-3.4.jar:/usr/share/idea/lib/forms_rt.jar:/usr/share/idea/lib/aether-connector-basic-1.1.0.jar:/usr/share/
8758 Jps -m
1435 Main

	-  -v 输出虚拟机进程启动时JVM参数
[shankai@shankai Desktop]$ jps -v
4353 Solution68 -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:40383,suspend=y,server=n -javaagent:/usr/share/idea/lib/rt/debugger-agent.jar=file:/tmp/capture.props -Dfile.encoding=UTF-8
7986 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/home/shankai/IdeaProjects/StrToInt -Dpreload.config.path=/home/shankai/.IdeaIC2018.2/config/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-601983381367185574 -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US -Didea.paths.selector=IdeaIC2018.2 -Didea.home.path=/usr/share/idea -Didea.config.path=/home/shankai/.IdeaIC2018.2/config -Didea.plugins.path=/home/shankai/.IdeaIC2018.2/config/plugins -Djps.log.dir=/home/shankai/.IdeaIC2018.2/system/log/build-log -Djps.fallback.jdk.home=/usr/java/jdk1.8.0_171 -Djps.fallback.jdk.version=1.8.0_171 -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/home/shankai/.IdeaIC2018.2/system/compile-server/strtoint_b4d82c58/_temp_ -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilation=true -Dkotlin.daemon.enabled -Dkotlin.daemon.client.alive.path="/tmp/kotlin-idea-
8793 Jps -Dapplication.home=/usr/lib/jvm/java-8-openjdk -Xms8m
1435 Main -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dawt.useSystemAAFontSettings=on -Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine -XX:ErrorFile=/home/shankai/java_error_in_IDEA_%p.log -XX:HeapDumpPath=/home/shankai/java_error_in_IDEA.hprof -Didea.paths.selector=IdeaIC2018.2 -Djb.vmOptionsFile=/usr/share/idea/bin/idea64.vmoptions -Didea.platform.prefix=Idea -Didea.jre.check=true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值