javap
javap [options] classfile…
javap命令反汇编一个或多个类文件。输出取决于所使用的选项。如果不使用任何选项,则javap命令将打印程序包,受保护的字段和公共字段以及传递给它的类的方法。javap命令将其输出打印到stdout
jps
JVM Process Status Tool - Lists instrumented HotSpot Java virtual machines on a target system.
JVM进程状态工具-列出目标系统上已检测到的HotSpot Java虚拟机
jstat
监视Java虚拟机(JVM)统计信息,主要是 GC 信息,在性能优化中经常用到。此命令是实验性的不受支持。
通过 jps 查到的进程号 31007,我们使用 jstat -gc 31007 来查看该进程的 GC 信息
每个对象都有一个指向它自身类的指针,_klass: 指向类的 4 字节指针,64 位平台上 _klass: 指向类的 8 字节的指针,为了节约这些空间,引入了类指针压缩空间。
jcmd
JVM诊断命令工具-将诊断命令请求发送到正在运行的Java虚拟机,可以查看 JVM 信息
jcmd [-l|-h|-help]
先使用 jps 获取 [pid]
使用 jcmd [pid] help 来查看都支持什么命令
选一个参数,比如打印堆的信息,使用 jcmd 31007 GC.heap_info 命令
还可以进一步查看命令的班帮助信息 jcmd 31007 help GC.heap_dump
jmap
jmap是一个重要的工具,查看内存详细信息,可以dump到文件中
使用:
jmap [-F] -dump:live,format=b,file=/tmp/a pid
-F 表示强制执行,live表示收集存活的对象,file存储到某个文件。dump文件下来后,可以使用工具来分析堆内存,包括jmap -histo、mat等
jmap [-F] -histo pid
查看堆内存的情况,按照对象数和对象占用的内存排队,可以初步定位到是哪个对象占用过多内存,内存泄漏的地方。后面使用mat工具能分析到哪个来存储的这个对象,也就是GCroot在哪
jmap [-F] heap pid
heap能查看当前使用的垃圾收集器是什么和一些参数策略,还有具体的内存分布,一般用不到。参数可以用jinfo,内存分布可以用jstat
jhat
jhat会分析一个dump文件,然后把结果发布到一个html服务器上,有一定的用途,html也是主要看histogram。和我们的jmap -histo功能类似,所以楼主觉得用处不大。
使用:
jhat file
返回访问127.0.0.1:7000 查看histogram
jstack
jstack是比较有用的一个命令,查看线程的情况,包含锁,打印Java进程,核心文件或远程调试服务器的Java线程堆栈跟踪,俗称javacore
使用:
jstack [-F] [-l] pid
-l包含锁信息
jconsole
查看jvm的内存,cpu信息,线程,参数,类信息
jvisualvm
是一个比较好用的工具,界面功能更强大,界面更友好。
也是监控内存,cpu,线程,类信息和参数的。还可以执行dump和javacore的生成。
如果产线允许的话,可以直接连接到产线发现解决问题。设置远程ip和jmx端口。当然产线的java启动需要设置jmx配置:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=18080
mat
mat是一个比较强大的分析堆溢出的工具。把之前dump文件导入到工具中。
首先看overview。
有几个比较重要的信息。
1、图中列出的大对象
左击list object->with outgoing references,查看次大对象是哪个GCroot。
shallow heap为本对象大小,retained heap为实际包含的对象的总大小。主要看retained heap,一层一层展开,能够看到哪个类中存在存储大对象。
2、histogram
和jmap -histo和jhat中的类似。
3、dominator tree
查看各个对象的GCroot,和第一个点类似
4、leak suspects
内存泄漏疑点报告,会把可能的内存泄漏点展示,再查看detail,就能看到具体信息。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。