JVM性能分析常用命令及工具
linux上系统命令:
uptime 查看系统启动时间, 内存/cpu使用情况等信息
top 查看系统资源占用情况
pidstat 查看指定进程/线程的信息(如果没有需要额外安装)
进程/线程资源占用情况,有没有死锁等等
iostat 系统io情况
vmstat 虚拟机信息
netstat 网络端口信息
ifstat 网卡信息
dstat 需要安装,相当于以上stat的集成功能
Java自带工具:(具体使用-help查看)
jps 类似于linux上的ps, 不过jps只用于查看在jvm上运行的进程
jstack 查看线程栈信息
jmap 查看/导出堆信息
jhat 配合jmap分析到处的堆信息
jinfo 查看进程的环境变量参数, vm args等信息,部分参数可以直接修改
jstat 查看jvm进程信息
例如:jstat -gc 32775 1000 10
代表打印pid为32775的gc信息10次, 每1000毫秒(1秒)一次
可视化工具
jconsole 查看资源/堆栈/线程等信息
jvisualVM 可用于分析导出堆信息, 以及包含jconsole的功能
OQL对象查询语句, 可以在分析堆时查询,
该工具JDK9开始已经不再打包在jdk中,
需要单独下载:http://visualvm.github.io/download.html
Eclipse内存分析MAT
Memory Analyzer Tool 分析堆导出信息, 也可以使用OQL查询
引用图: 对象之间相互引用的图
支配树: 对象a访问对象c时,只有通过对象b才能访问c, 则b对c有支配权, c是b的下级
浅堆: 浅堆表示一个对象的结构所占内存,与实际内容无关,
比如String包含 (value引用,hash值,offset起始位置,count字符数) int(4)x3+value引用占4字节=16
, 最后对象头部固定8字节,总共16+8=24字节.
深堆: 对象在被GC回收时,实际回收了多少内存=只能通过该对象(直接/间接)访问到的所有对象的浅堆之和(支配树)