六个命令行排查工具
我们一般使用 JDK 自带的 6 个命令行工具来排查JVM。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行。
jps(虚拟机进程状况工具)
jps(JVM Process Status tool,虚拟机进程状况工具),用于列出正在运行的 JVM 的 LVMID(Local Virtual Machine IDentifier,本地虚拟机唯一 ID),以及 JVM 的执行主类、JVM 启动参数等信息。语法如下:
jps [options] [hostid]
常用的 options 选项:
-l:用于输出运行主类的全名,如果是 jar 包,则输出 jar 包的路径;
-q:用于输出 LVMID(Local Virtual Machine Identifier,虚拟机唯一 ID);
-m:用于输出虚拟机启动时传递给主类 main() 方法的参数;
-v:用于输出启动时的 JVM 参数。
jstat(虚拟机统计信息监视工具)
jstat(JVM Statistics Monitoring Tool,虚拟机统计信息监视工具)用于监控虚拟机的运行状态信息。
查询后的参数说明:
参数 | 说明 |
---|---|
S0C | 年轻代中第一个存活区的大小 |
S1C | 年轻代中第二个存活区的大小 |
S0U | 年轻代中第一个存活区已使用的空间(字节) |
S1U | 年轻代中第二个存活区已使用的空间(字节) |
EC | Edem 区大小 |
EU | 年轻代中 Edem 区已使用的空间(字节) |
OC | 老年代大小 |
OU | 老年代已使用的空间(字节) |
YGC | 从应用程序启动到采样时 young gc 的次数 |
YGCT | 从应用程序启动到采样时 young gc 的所用的时间(s) |
FGC | 从应用程序启动到采样时 full gc 的次数 |
FGCT | 从应用程序启动到采样时 full gc 的所用的时间 |
GCT | 从应用程序启动到采样时整个 gc 所用的时间 |
jstat 常用的查询参数有:
-class,查询类加载器信息;
-compiler,JIT 相关信息;
-gc,GC 堆状态;
-gcnew,新生代统计信息;
-gcutil,GC 堆统计汇总信息。
jinfo(查询虚拟机参数配置工具)
jinfo(Configuration Info for Java)用于查看和调整虚拟机各项参数。语法如下:
jinfo <option> <pid>
jmap(堆快照生成工具)
jmap(Memory Map for Java)用于查询堆的快照信息。
jhat(堆快照分析功能)
jhat(JVM Heap Analysis Tool,堆快照分析工具)和 jmap 搭配使用,用于启动一个 web 站点来分析 jmap 生成的快照文件。
jstack(查询虚拟机当前的线程快照信息)
jstack(Stack Trace for Java)用于查看当前虚拟机的线程快照,用它可以排查线程的执行状况,例如排查死锁、死循环等问题。
两个可视化排查工具
JConsole 和 JVisualVM 都位于 JDK 的 bin 目录下,JConsole(Java Monitoring and Management Console)是最早期的视图调试工具。
用 JConsole 可以监控线程、CPU、类、堆以及 VM 的相关信息,同样我们可以通过线程这一页的信息,发现之前我们故意写的死锁问题。
JVisualVM 既可以调试本地也可以调试远程服务器
JVM 调优
JVM 调优主要是根据实际的硬件配置信息重新设置 JVM 参数来进行调优的。
JVM 常见调优参数包含以下这些:
-Xmx,设置最大堆内存大小;
-Xms,设置初始堆内存大小;
-XX:MaxNewSize,设置新生代的最大内存;
-XX:MaxTenuringThreshold,设置新生代对象经过一定的次数晋升到老生代;
-XX:PretrnureSizeThreshold,设置大对象的值,超过这个值的对象会直接进入老生代;
-XX:NewRatio,设置分代垃圾回收器新生代和老生代内存占比;
-XX:SurvivorRatio,设置新生代 Eden、Form Survivor、To Survivor 占比。