定位问题,知识、经验是关键,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore文件)、堆转储快照(heapdump/hprof文件)等
一、工具
1. JDK命令行工具(大多是jdk/lib/tols.jar的封装)
【1】jps:显示系统内所有HotSpot虚拟机进程
在一台hadoop服务器(jdk1.8)上执行试试看,可以看到3个进程在运行
【2】jstat:监视虚拟机各种运行状态信息
选一个刚才jps显示的进程号,比如26437
执行jstat -gc 26437 250,表示250ms查询一次进程26437 垃圾收集情况。
执行jstat -gcuti 26437,显示已使用空间占总空间百分比
S0、S1 表示Survivor0、Survivor1
E表示Eden,O表示Old,M表示Metaspace,CCS 压缩类空间 (Metaspace的一部分),YGC 年轻代GC总次数 ,YGCT 年轻代GC总时间
jstat工具主要选项:
-class (类加载器)
-compiler (JIT)
-gc (GC堆状态)
-gccapacity (各区大小)
-gccause (最近一次GC统计和原因)
-gcnew (新区统计)
-gcnewcapacity (新区大小)
-gcold (老区统计)
-gcoldcapacity (老区大小)
-gcpermcapacity (永久区大小)
-gcutil (GC统计汇总)
-printcompilation (HotSpot编译统计)
【3】jinfo:显示虚拟机配置信息
jinfo -flag xxx 26437
此处验证了在jdk1.8中,默认所有对象优先在Eden分配,默认年龄为15的对象进入老年代。
【4】jmap:生成虚拟机的内存转储快照(heapdump)
除了jmap获取dump文件,还有几种方式:
- 通过-XX:+HeapDumpOnOutOfMemoryError参数,让虚拟机在OOM后自动生成dump文件
- 通过-XX:+HeapDumpOnCtrlBreak参数,使用【Ctrl】+【Break】键让虚拟机生成dump文件
- Linux下通过Kill -3命令发送进程退出信号“吓唬”一下虚拟机,也能拿到dump文件
jmap工具主要选项:
-dump(生成dump文件)
-finalizerinfo(F-Queue中等待的对象)
-heap(java堆详细信息)
-histo(堆中对象统计信息)
-F(强制生成快照)
【5】jhat:用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
【6】jstack:用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)
主要目的是定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源时间长。
2. JDK可视化工具
1. JConsole(基于JMX) Java监视与管理控制平台
2. VisualVM 多和一故障处理工具
二、调优案例
以后再写。