JDK内置工具使用总结
1 jinfo 查看或修改java 进程的opts
Usage:jinfo <option> <pid>(to connect to a running process)
参数说明
where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both VM flags and system properties
-? | -h | --help | -help to print this help message
使用示例
比如: jinfo -sysporps 7459
jinfo -flags 7459
增加jvm 参数:
jinfo -flag +TraceClassLoading
2 jstat 查看JVM运行时的状态信息
参数说明
Usage: jstat --help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:`
<n>["ms"|"s"]
Where <n> is an integer and the suffix specifies the units as
milliseconds("ms") or seconds("s"). The default units are "ms".
<count> Number of samples to take before terminating.
-J<flag> Pass <flag> directly to the runtime system.
-? -h --help Prints this help message.
-help Prints this help message.
我们先看下 有哪些参数
option参数解释:
参数名称 | 意义 |
---|---|
-class | class loader的行为统计 |
-compiler | HotSpt JIT编译器行为统计 |
-gc | 垃圾回收堆的行为统计 |
-gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计 |
-gcutil | 垃圾回收统计概述 |
-gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因 |
-gcnew | 新生代行为统计 |
-gcnewcapacity | 新生代与其相应的内存空间的统计 |
-gcold | 年老代和永生代行为统计 |
-gcoldcapacity | 年老代行为统计 |
-gcpermcapacity | 永生代行为统计 |
-printcompilation | HotSpot编译方法统计 |
使用示例
jstat -gcutil 36709 5000
,这种是直接在屏幕打印,如果要把结果输出文件供后续分析,可以 指定文件写入 jstat -gcutil 36709 5000 > /mnt/disk1/jstat.log
查看类加载信息:
jstat -class 95647 5000
可以结合jconsole 查看类加载卸载信息:
要监控某个远程服务器进程,先查找进程对应端口号然后配置即可。
3 jstack 查看线程堆栈信息
参数说明
jstack -h
命令说明如下:
jstack [-l] (连接运行中的进程)
jstack -F [-m] [-l] (连接挂起的进程)
jstack [-m] [-l] (连接core文件)
jstack [-m] [-l] [server_id@] (连接远程debug服务器)
jstack pid 模式直接打印进程堆栈,不过查看分析不方便,可以输出到文件,可以分析线程情况
使用示例
jstack pid > /local/user-define-filename.log
如果服务器上某java 进程导致CPU 很高,可结合top 以及jstack 命令查找占用cpu 高的线程详情。
1.查找进程
top查看进程占用资源情况
2.查找线程
使用top -H -p 查看线程占用情况 top -H -p 17850
3.查找java的堆栈信息
将线程id转换成十六进制
printf "%xn" tid
输出比如 3d30
然后再使用jstack查询线程的堆栈信息
语法:jstack | grep -A 线程id(十六进制)
jstack | grep -a 3d30
4 jmap 查看线程堆栈信息
参数说明
jmap -h 查看命令参数
使用示例
jhsdb jmap --heap --pid 19004
jmap -histo:live 28806 > /mnt/disk1/jmap-histo-live2.log
输出存活对象统计信息内
jmap -clstats 28806 > /mnt/disk1/jmap-clstats2.log
内存中类统计信息
dump 参数是把JVM 内存 中对象快照输出,一般二进制存储,配合 jvisualvm 工具查看。参见 jvisualvm章节
jmap -dump:live,format=b,file=/mnt/disk1/data-collection-dump.hprof 27696
5 jhat web 查看工具
jhat命令将dump出来的hprof文件转成html的形式,然后通过http访问可以查看堆情况
参数说明
使用示例
jhat -J-Xmx4096m /mnt/disk1/163555-jmap-dump.hprof
/mnt/disk1/163555-jmap-dump.hprof 是已经dump 保存的文件。
由于要解析dump 文件,比较耗时,和文件大小相关。
http://ip:8111 访问
底部可以点击进入OQL 查询界面
select count(unique(map(heap.objects('java.lang.String'), 'it.value')))
select count(heap.objects('java.lang.String'))
点击OQL Help 可查看相关语法。
6 jvisualvm 可视化工具
jvisualvm 运行程序 在JDK 目录 \bin 目录下, jvisualvm.exe 。jdk 11 版本需要单独安装,可自行上网查阅方法。
jvisualvm 初始内存配置较小,一般dump 的内存文件比较大,因此需要调整 jvisualvm 内存参数,JDK 在 \lib\visualvm\etc\visualvm.conf 中设置 以下两个参数,根据dump 文件大小设置。
-J-Xms24m -J-Xmx2048m
jvisualvm 两种核心功能
1 远程监控java程序运行情况
类似jconsole。 打开jvisualvm,可直接查看本地JVM 程序情况,也可以远程监控服务器端程序,需要在对应程序启动时添加虚拟机参数
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=7901
-Dcom.sun.management.jmxremote.ssl=false <!--需要安全验证设置true,要处理server 和client 两端的公钥和私钥-->
-Dcom.sun.management.jmxremote.authenticate=false <!--需要安全验证设置true 设置登入密码-->
我们先不用ssl 和 authenticate ,开启jmx,通过jvisualvm 连接。
2 直接打开jmap 命令 dump 文件
通过菜单栏文件-装入 加载dump 文件并打开
OQL是用于查询Java堆的类SQL查询语言。OQL允许过滤/选择从Java堆中获取的信息。虽然HAT已经支持预定义的查询,例如“显示类X的所有实例”,但OQL增加了更多的灵活性。OQL基于JavaScript表达式语言。
查询形式:
select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression to filter> ] ]
比如:查询类在加其加载的类
select { loader: cl,
classes: filter(map(cl.classes.elementData, 'it'), 'it != null') }
from instanceof java.lang.ClassLoader cl
显示java.io.InputStream的所有子类
select heap.findClass("java.io.InputStream").subclasses()
可以使用JavaScript对象文字或数组选择多个值。
示例:显示每个线程对象的名称和线程
select { name: t.name? t.name.toString() : "null", thread: t }
from instanceof java.lang.Thread t
浏览以下网站可查询更加详细的
https://blogs.oracle.com/sundararajan/querying-java-heap-with-oql