一.JDK
为我们提供的工具:
在Windows
中对于这些命令的支持是源自JDK
-->bin
下面的.exe
可执行文件的支持。
在Linux
中对于这些命令的支持是源自JDK
-->bin
下面可执行文件的支持。
二. 命令解析
2.1jps
列出当前机器上正在运行的虚拟机进程,JPS
从操作系统的临时目录上去找(所以有一些信息可能显示不全)。
eg:jps -l
2.2jstat
用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
2.2.1 语法规则
jstat [Options] vmid [interval] [count]
Options:选项vmid:VM的进程号,即当前运行的java进程号(pid)interval:采样间隔,单位为秒(s)或毫秒(ms)。默认单位是毫秒。必须为正整数。指定后,该jstat命令将在每个间隔产生其输出。count:打印次数,如果缺省则打印无数次
2.2.2 特别说明之 jstat -class pid
eg:jstat -class pid
2.2.3 特别说明之 jstat -gc pid
亦可每秒刷新一次,输出50次:jstat -gc 18787 1000 50
2.3jinfo
查看和修改虚拟机的参数 (高级参数是否能修改在2.4中介绍)
语法:
jinfo [ option ] pid
eg:
添加GC日志打印
jinfo -flag +PrintGC 24762
查看打印 GC 详情
jinfo -flag PrintGC 24762
取消打印 GC 详情
jinfo -flag -PrintGC 24762
2.4VM参数
VM参数是虚拟机可配置的参数,通过这些参数,我们可以了解虚拟机的运行时的参数配置,有助于我们了解虚拟机的运行状态。可分为以下6种:
2.4.1Standard Options
标准选项
标准选项:-options
,所有的HotSpot
都支持
2.4.2 Non-Standard Options 非标准选项
非标准选项-Xoptions
,特定版本 HotSpot 支持特定命令 非标准选项是特定于 Java HotSpot 虚拟机的通用选项。因此不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化,这些选项以开头-X。eg: -Xms30m -Xmx30m -Xss1m
2.4.3Advanced Runtime Options
高级选项
高级选项:以开头-XX: 这些是开发人员选项,用于调整 Java HotSpot 虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数的特权访问。也不能保证所有 JVM 实现都支持它们,并且它们可能会发生变化。
2.4.4 VM高级参数命令行中查找
可以在windows
中通过java -XX:+PrintFlagsFinal -version
查看
第一列:配置参数的属性 布尔、int等;第二列:配置参数名;第三列:配置参数的默认值;第四列:配置参数是否可以再运行时修改生效等(product 不能,manageable 可以)。
其他的就不在做过多的介绍,有兴趣可以自行查看Oracle jdk8官方文档
2.5jmap
用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java 堆和永 久代的详细信息,如空间使用率、当前用的是哪种收集器等。和 jinfo 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的 -dump 选项和用于查看每个类的实例、空间占用统计的-histo 选项在所有操作系统都提供之外,其余选项都只能在 Linux/Solaris 下使用。
2.5.1jmap -heap pid
使用
2.5.2jmap -histo
jmap -histo 打印每个 class 的实例数目,内存占用,类全名信息.jmap –histo:live 如果 live 子参数加上后,只统计活的对象数量.但是这样显示太多了,一般在 linux 上会这么操作 jmap –histo 1196 | head -50 (显示排名前 20 的数据)
不太重要的参数 -finalizerinfo 打印正等候回收的对象的信息,还有 jmap –clstats 这个命令最好也不要去使用
-dump 生成的堆转储快照(比较重要) jmap -dump:live,format=b,file=heap.bin Sun JDK 提供 jhat(JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。
2.6jhat
jhat dump 文件名 后屏幕显示“Server is ready.”的提示后,用户在浏览器中键入 http://localhost:7000/就可以访问详情
使用 jhat 可以在服务器上生成堆转储文件分析(一般不推荐,毕竟占用服务器的资源,比如一个文件就有 1 个 G 的话就需要大约吃一个 1G 的内存资源)
2.7jstack
(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主 要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
在代码中可以用 java.lang.Thread 类的 getAllStackTraces()方法用于获取虚拟机中所有线程的 StackTraceElement 对象。使用这个方法可以通过简单的几行 代码就完成 jstack 的大部分功能,在实际项目中不妨调用这个方法做个管理员页面,可以随时使用浏览器来查看线程堆栈。(并发编程中的线程安全课程 中有具体的案例)
一般来说 jstack 主要是用来排查是否有死锁的情况,这块内容在并发编程(包括二期)中有详细的讲解
三. 命令工具总结
3.1 生产服务器推荐开启
-XX:-HeapDumpOnOutOfMemoryError
默认关闭,建议开启,在java.lang.OutOfMemoryError
异常出现时,输出一个 dump 文件,记录当时的堆内存快照。
-XX:HeapDumpPath=./java_pid<pid>.hprof
用来设置堆内存快照的存储文件路径,默认是 java 进程启动位置。
3.2 调优之前开启、调优之后关闭
-XX:+PrintGC
调试跟踪之 打印简单的 GC 信息参数:
-XX:+PrintGCDetails, +XX:+PrintGCTimeStamps
打印详细的 GC 信息
-Xlogger:logpath
设置 gc 的日志路,如: -Xlogger:log/gc.log, 将 gc.log 的路径设置到当前 目录的 log 目录下.
应用场景: 将 gc 的日志独立写入日志文件,将 GC 日志与系统业务日志进行了分离,方便开发人员进行追踪分析。
3.3 考虑使用
-XX:+PrintHeapAtGC
, 打印堆信息
参数设置:-XX:+PrintHeapAtGC
应用场景: 获取 Heap 在每次垃圾回收前后的使用状况
-XX:+TraceClassLoading
参数方法:-XX:+TraceClassLoading
应用场景: 在系统控制台信息中看到 class 加载的过程和具体的 class 信息,可用以分析类的加载顺序以及是否可进行精简操作。-XX:+DisableExplicitGC
禁止在运行期显式地调用System.gc()