JDK内置工具使用总结

本文详细介绍了JDK内置的多种工具,如jinfo、jstat、jstack、jmap和jhat,用于查看和分析Java进程的配置、JVM状态、线程堆栈、内存分配及堆分析。通过这些工具,开发者可以有效地监控和诊断Java应用的性能问题,例如GC行为、类加载信息和CPU占用等。此外,还提到了jvisualvm作为一款可视化工具,用于远程监控和分析Java程序,并利用OQL进行堆查询。
摘要由CSDN通过智能技术生成

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

jinfo -flags 7459

jinfo-flags

增加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.

我们先看下 有哪些参数

jstat-options

option参数解释:

参数名称意义
-classclass loader的行为统计
-compilerHotSpt JIT编译器行为统计
-gc垃圾回收堆的行为统计
-gccapacity各个垃圾回收代容量(young,old,perm)和他们相应的空间统计
-gcutil垃圾回收统计概述
-gccause垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因
-gcnew新生代行为统计
-gcnewcapacity新生代与其相应的内存空间的统计
-gcold年老代和永生代行为统计
-gcoldcapacity年老代行为统计
-gcpermcapacity永生代行为统计
-printcompilationHotSpot编译方法统计

使用示例

jstat -gcutil 36709 5000这种是直接在屏幕打印,如果要把结果输出文件供后续分析,可以 指定文件写入 jstat -gcutil 36709 5000 > /mnt/disk1/jstat.log

jstat-gcutil

查看类加载信息:

jstat -class 95647 5000

jstat-class

可以结合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 查看命令参数

jmap-parameter

使用示例

jhsdb jmap --heap --pid 19004

jmap

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

使用示例

jhat -J-Xmx4096m /mnt/disk1/163555-jmap-dump.hprof

/mnt/disk1/163555-jmap-dump.hprof 是已经dump 保存的文件。

由于要解析dump 文件,比较耗时,和文件大小相关。

在这里插入图片描述

http://ip:8111 访问
在这里插入图片描述

底部可以点击进入OQL 查询界面

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 连接。

jvisualvm1

jvisualvm2

在这里插入图片描述

2 直接打开jmap 命令 dump 文件

通过菜单栏文件-装入 加载dump 文件并打开

jvisualvm-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

OQL1

显示java.io.InputStream的所有子类

select heap.findClass("java.io.InputStream").subclasses()

OQL2

可以使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

meditator_wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值