Java自带的JVM性能监控及调优工具(jps、jinfo、jstat、jmap、javap)使用介绍

2023-03-27 15:05:56

JVM介绍

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

JVM性能监控及调优的意义

JVM作为java程序运行时的环境,它的性能好坏直接影响java程序的性能,合适的环境对于java程序起着举足轻重的作用。

性能监控及调优工具

 

1. jps

jps(Java Virtual Machine Process Status Tool)是JDK1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),并可通过opt来查看这些进程的详细启动参数。

使用方式:

$>jps
4600
8600 Jps
5052 TestClass1

可用参数:

-m 输出传递给main方法的参数

$>jps -m
8464 Jps -m
4600
5052 TestClass1

-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名

$>jps -l
5552 sun.tools.jps.Jps
4600
5052 com.test.TestClass1

-v 输出传递给JVM的参数

$>jps -v
4600  -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
10988 Jps -Denv.class.path=.;D:\soft\jdk1.8.0_65\lib\dt.jar;D:\soft\jdk1.8.0_65\lib\tools.jar; -Dapplication.home=D:\soft\jdk1.8.0_65 -Xms8m
5052 TestClass1 -Dfile.encoding=UTF-8

-lmv 组合输出

$>jps -lmv
4600  -Dosgi.requiredJavaVersion=1.8 -Dosgi.instance.area.default=@user.home/eclipse-workspace -XX:+UseG1GC -XX:+UseStringDeduplication -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
5052 com.test.TestClass1 -Dfile.encoding=UTF-8
7612 sun.tools.jps.Jps -lmv -Denv.class.path=.;D:\soft\jdk1.8.0_65\lib\dt.jar;D:\soft\jdk1.8.0_65\lib\tools.jar; -Dapplication.home=D:\soft\jdk1.8.0_65 -Xms8m

2. jinfo

jinfo 命令可以查看java进程的运行时jvm参数详细信息,例如最大堆内存、使用的什么垃圾收集器等

-flags pid 查看指定java进程的所有jvm运行参数

$>jinfo -flags 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:MaxHeapSize=2122317824 -XX:MaxNewSize=707264512 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -Dfile.encoding=UTF-8

-flags [指定参数] pid 查看java进程指定jvm运行参数

$>jinfo -flag InitialHeapSize 5052
-XX:InitialHeapSize=134217728

3. jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量

-class pid查看java进程类加载统计

$>jstat -class 5052
Loaded  Bytes  Unloaded  Bytes     Time
  1663  3061.7        0     0.0       0.37

-compiler pid查看java进程编译统计

$>jstat -compiler 5052
Compiled Failed Invalid   Time   FailedType FailedMethod
     659      0       0     0.52          0

-gc pid查看java进程垃圾回收统计

$>jstat -gc 5052
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT  
5120.0 5120.0  0.0    0.0   33280.0  16650.3   87552.0      0.0     4480.0 767.4  384.0   75.8       0    0.000   0      0.000    0.00

-gccapacity pid查看java堆内存统计

$>jstat -gccapacity 5052
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 43520.0 690688.0  43520.0 5120.0 5120.0  33280.0    87552.0  1381888.0    87552.0    87552.0      0.0 1056768.0   4480.0      0.0 1048576.0    384.0      0     0

4. jmap

JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。 jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。【内存分析】

-dump pid  dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名 

$>jmap -dump:live,format=b,file=dump.hprof 5052
Dumping heap to C:\Users\jasonspears\Desktop\dump.hprof ...
Heap dump file created

-heap pid 打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

$>jmap -heap 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2122317824 (2024.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 707264512 (674.5MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 34078720 (32.5MB)
   used     = 1022416 (0.9750518798828125MB)
   free     = 33056304 (31.524948120117188MB)
   3.0001596304086537% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation
   capacity = 36175872 (34.5MB)
   used     = 1863752 (1.7774124145507812MB)
   free     = 34312120 (32.72258758544922MB)
   5.151920042176178% used

5486 interned Strings occupying 442328 bytes.

-finalizerinfo pid 打印等待回收的对象信息

$>jmap -finalizerinfo 5052
Attaching to process ID 5052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Number of objects pending for finalization: 0

 5. javap

javap是java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。

具体说明参考https://www.cnblogs.com/frinder6/p/5440173.html

  • 作者:HMDOBO
  • 原文链接:https://blog.csdn.net/weixin_37162010/article/details/80783300
    更新时间:2023-03-27 15:05:56