JVM性能优化之JVM调试


文章目录

  • JVM性能优化之JVM调试
  • 前言
  • 一、jps
  • 二、 jinfo
  • 三、 jstat
  • 四、 jstack
  • 五、 jmap
  • 六、 jhat



前言

前面文章简单的对JVM进行了简单的讲解,本文来简单讲解一下一些在JVM调试过程中使用到的操作命令。

一、jps

jps是JDK 1.5提供的一个显示当前所有java进程pid的命令,相当于Java版本的ps命令,可以查看Java进程及其相关信息。在windows的CMD或者Linux都可以直接输入命令查看相关信息。

jps [options] [hostid]

jps有以下参数:

option

参数详情

-l

显示进程id,显示主类全名或jar路径。

-q

显示进程id。

-m

显示进程id, 显示JVM启动时传递给main()的参数。

-v

显示进程id,显示JVM启动时显示指定的JVM参数。

写一个死循环代码保持测试代码执行中

public static void main(String[] args){
        while (true){
            System.out.println("测试");
        }
    }

使用jps -v命令查看当前代码的JVM参数配置信息。

服务器重启java就打不开了 重启jvm服务_服务器重启java就打不开了

二、 jinfo

jinfo是用来查看JVM参数以及动态修改部分JVM参数的命令,也是JDK中自带的。

jinfo [option] <pid> //查看运行中的程序,pid为程序进程号
jinfo [option] <executable <core> //查看javadump文件信息,代码崩溃的时候会产生对应的dump文件
jinfo [option] [server_id@]<remote server IP or hostname> //远程查看服务信息

jinfo有以下参数(不填写默认输出所有的系统属性和参数):

option

参数详情

-flag

打印指定名称的参数

-flag[+/-]

打开或关闭参数

-flag=

设置参数

-flags

打印所有参数

-sysprops

打印系统设置

使用jinfo直接填写上面jps获取的测试代码的进程ID看一下结果:

服务器重启java就打不开了 重启jvm服务_java_02

三、 jstat

jstat也是JDK自带的JVM查看命令,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] //后面两个是间隔时间和查询次数

jstat有以下参数:

option

参数详情

-class

查看类加载器的信息

-compiler

查看JIT编译器的信息

-gc

垃圾回收的信息

-gccapacity

各垃圾回收代相应的信息

-gcutil

垃圾回收主要信息

-gccause

垃圾回收主要信息及最近两次垃圾回收的原因

-gcnew

新生代垃圾回收信息

-gcnewcapacity

新生代与其相应的内存空间信息

-gcold

老年代垃圾回收信息

-gcoldcapacity

老年代及其相应的内存空间信息

printcompilation

HotSpot编译方法统计

使用jstat查看上面代码的垃圾回收信息:

服务器重启java就打不开了 重启jvm服务_java_03


GC对应信息参照:

代码

具体含义

S0C

survivor0大小

S1C

survivor1大小

S0U

survivor0已使用大小

S1U

survivor1已使用大小

EC

Eden区大小

EU

Eden区已使用大小

OC

老年代大小

OU

老年代已使用大小

MC

方法区大小

MU

方法区已使用大小

CCSC

压缩类空间大小

CCSU

压缩类空间已使用大小

YGC

年轻代垃圾回收次数

YGCT

年轻代垃圾回收消耗时间

FGC

Full GC垃圾回收次数

FGCT

Full GC垃圾回收消耗时间

GCT

垃圾回收消耗总时间

四、 jstack

jstack是用来查看JVM线程快照的命令,线程快照指的是JVM线程正在执行的方法堆栈集合。使用jstack命令可以定
位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信
息。

jstack [-l] <pid> 
jstack -F [-m] [-l] <pid>
jstack [-m] [-l] <executable> <core> 
jstack [-m] [-l] [server_id@]<remote server IP or hostname>

jstack参数如下:

option

参数详情

-F

当使用jstack 无响应时,强制输出线程堆栈。

-m

同时输出java堆栈和c/c++堆栈信息(混合模式)

-l

除了输出堆栈信息外,还显示关于锁的附加信息

例如我们使用jstack查看上面的死循环代码定位死循环位置:

服务器重启java就打不开了 重启jvm服务_调试命令_04

五、 jmap

jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

jmap [option] <pid>
jmap [option] <executable <core>
jmap [option] [server_id@]<remote server IP or hostname>

jmap参数如下:

option

参数详情

-heap

打印堆的摘要信息

-histo[:live]

打印堆中的java对象统计信息

-clstats

打印类加载器统计信息

-finalizerinfo

打印在f-queue中等待执行finalizer方法的对象

-dump:< dump-options >

生成java堆的dump文件

例如我们查看堆的信息,只截图了部分,后面还有每个区的大小、使用情况、剩余情况信息:

服务器重启java就打不开了 重启jvm服务_java_05

六、 jhat

jhat也是jdk内置的工具之一。主要是用来分析dump的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果。

jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

jhat参数如下:

option

参数详情

-stack false

关闭对象分配调用堆栈的跟踪

-refs false

关闭对象引用的跟踪

-port

HTTP服务器端口,默认是7000 -debug : debug级别

-version

分析报告版本

例如我们使用jmap -dump:live,file=f://dupm.bin 25736生成示例代码的dump,然后使用jhat分析

服务器重启java就打不开了 重启jvm服务_JVM_06


打开7000端口号:

服务器重启java就打不开了 重启jvm服务_java_07