虚拟机研究系列-了解JVM工具指令

jps(Java process status)

jps -l 全限定名以及jar包全限定名称

jps -lv 包含虚拟机参数以及包全限定名

jps -v 包含虚拟机进程参数

jps -m 包含程序入口参数


jstat(Java Virtual Machine statistics monitoring tool)

-class 显示ClassLoad的相关信息;

-compiler 显示JIT编译的相关信息;

-gc 显示和gc相关的堆信息;

-gccapacity    显示各个代的容量以及使用情况;

-gcmetacapacity 显示metaspace的大小

-gcnew 显示新生代信息;

-gcnewcapacity 显示新生代大小和使用情况;

-gcold 显示老年代和永久代的信息;

-gcoldcapacity 显示老年代的大小;

-gcutil 显示垃圾收集信息;

-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;

-printcompilation 输出JIT编译的方法信息;


jmap

jmap -dump:[live],format=b, file=filename

  • 此命令为导出dump hropf堆内存文件,记录heap dump文件信息,
  • live标识只导出live活跃的object信息,file标识为导出文件目录名称+文件名称

jmap -finalizerinfo

  • 导出那些等待GC且为执行finalize对象的方法

jmap -heap

  • 打印堆内存的使用量以及先关配置、新生区的使用量以及常量池字符串

**jmap -histo[:子参数]

  • 统计java堆中的对象信息,子参数只有一个live(作用同-dump的字参数live)。
  • -permstat 显示永久代的状态。

-F Use with -dump or -histo to force a heap dump or histogram when pid does not respond. The "live" suboption is not supported in this mode.**

jhat

jhat(java Heap Analysis Tool):java堆(快照)分析工具

说明:

1) jhat通常与jmap一起使用,使用jhat来分析jmap生成的堆快照。

2) jhat内置了一个微型的HTTP/HTML服务器,使用jhat对heap dump进行分析后,可以在浏览器中查看分析的结果,查看地址:http://localhost:7000/

3) 我们一般会使用一些更加高级的工具(VisualVM、Eclipse Memory Analyzer)来分析heap dump,而不是使用jhat来分析heap dump。

格式:jhat /data/test/heapDump.bin

VisualVM 查看dump文件:

1)在jdk的安装目录下找到 bin/jvisualvm 命令,启动VisualVM

2)将dump文件的后缀修改为.hprof 说明:mac下,第3步只能选择.hprof后缀的dump文件。

3)文件 --> 装入 --> 在弹出的窗口中 [文件格式:] 选择 [堆 Dump (hprof)] 后,选中dump文件即可

jstack(java堆栈跟踪工具)

生成当前时刻的线程快照(线程快照被称为thread dump或javacore文件)

格式:jstack [option] PID

可选项:

-F 强制到处生成dump文件

-m to print both java and native frames (mixed mode)

-l long listing. Prints additional information about locks

-h 输出帮助信息

应用:排查线程出现长时间停顿的原因

1) 线程出现长时间停顿的常见场景:

1>死循环

2>线程间发生了死锁

3>请求外部资源导致的长时间等待

2)常用命令:

1> 转储堆栈信息:jstack PID > /data/test/threadDumpFile

2> 统计所有的线程分别处于什么状态jstack PID | grep java.lang.Thread.State | awk '{print 2345}' | sort | uniq -c

注意:

1) dump出来的线程ID(nid的值就是线程ID)是十六进制的,而我们用TOP命令看到的线程ID是十进制的。

注:使用printf命令将十进制的ID转换为十六进制的ID:printf "%x\n" 十进制的ID

2)用十六进制的ID去dump里找到对应的线程。

JCMD

jdk工具--jcmd

说明:jcmd用于向正在运行的JVM发送诊断信息请求(since JDK1.7),功能与jstack类似。

jcmd -l

列出当前所有运行的java进程,与jps命令的作用一样。

jcmd PID help

查看能从目标进程中获取到的信息

jcmd PID help GC.run

查看目标进程GC.run命令的说明

jcmd PID GC.run

调用java.lang.System.gc()方法

jcmd PID VM.version

查看JVM的版本信息

jcmd PID VM.system_properties

查看JVM的系统属性

举例:

进程启动命令中的java命令的安装路径,并不是 ${JAVA_HOME} 的值!代码中可通过System.getProperty("java.home")获取改值。

java.home=xxxx

jcmd PID VM.flags

查看JVM的参数

jcmd PID GC.class_histogram

查看JVM的类信息:每个类的实例数量和占用空间大小

jcmd PID Thread.print

查看JVM的Thread Dump

jcmd PID GC.heap_dump 转储文件的名称

查看JVM的Heap Dump

应用:分析内存泄露

1)先后执行两次Heap Dump和Thread Dump,在两次执行之间,执行一次GC。

2)如果在执行GC之后,还存在大对象,则该对象很可能是导致内存泄露的对象。

3)如果在执行GC之后,还有线程仍然在执行,则该线程很可能是导致内存泄露的线程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • JDK 1.7+(jcmd命令从JDK 1.7以后支持) JVM进程的pid(Linux环境可以通过ps -ef获...
    脆皮鸡大虾阅读 4,857评论 0 1
  • jps USAGE: jps [-help] jps [-q] [-mlvV] [<hostid>] OPTI...
    荣儿飞阅读 3,770评论 0 1
  • 简介 性能优化和故障排除是一件比较麻烦的事,针对性能优化,必须得先了解相关的优化工具,然后针对不同场景不同问题选用...
    奔跑地蜗牛阅读 3,757评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,763评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 11,368评论 4 8

友情链接更多精彩内容