JVM学习笔记之命令行监控工具

目录

背景

jps:查看正在运行的java进程

-q参数:只显示pid

-l:显示pid和主程序的全类名

-m:显示pid、进程名和主函数启动参数:

-v:显示pid、进程名和主函数启动的JVM参数:

jstat:查看JVM统计信息

option参数

类装载相关的

垃圾回收相关的

JIT相关的

interval参数

count参数

-t参数

-h参数

jinfo:实时查看和修改JVM参数

与jps -v的区别

查看参数

jinfo -sysprops PID

jinfo -flags PID

jinfo -flag 具体参数 PID

修改参数

拓展

-XX:+PrintFlagsInitial

-XX:+PrintFlagsFinal

-XX:+PrintCommandLineFlags

jmap:导出内存映像文件&内存使用情况

导出内存映像文件:-dump

手动方式

自动方式

显示内存相关信息

-heap

-histo

小结

jhat:jdk自带分析工具

 jstack:打印JVM中的线程快照

死锁

测试等待资源

同步测试

-l参数

jcmd:多功能命令行

查看JVM的进程号和主类的全类名:

查看可执行命令:jcmd pid help

查看线程信息:jcmd pid Thread.print

查看堆信息直方图:jcmd pid GC.class_histogram

导出堆映射文件:jcmd pid GC.heap_dump file_path

其他

强制执行一次GC

查看进程运行时间

查看系统属性

获取JVM参数

jstatd:远程主机信息收集

结语

背景

此文介绍常用的jvm命令行监控工具,基于jdk8,都是jdk自带的,可以在JAVA_HOME/bin目录下找到对应的可执行文件

jps:查看正在运行的java进程

显示指定系统内所有HotSpot虚拟机进程信息,会得到pid和进程名:

PS C:\WINDOWS\system32> jps
17472
19296 Launcher
1628 Jps

其中17472可以从任务管理器中查看,会发现是idea

写一个简单的阻塞程序,如下所示:

import java.util.Scanner;

public class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.next();
    }
}

运行后,再使用jps查看JVM进程如下:

-q参数:只显示pid

PS C:\WINDOWS\system32> jps -q
17472
1872
10204
12076

-l:显示pid和主程序的全类名

PS C:\WINDOWS\system32> jps -l
17472
10204 org.jetbrains.jps.cmdline.Launcher
12076 ScannerTest
1724 sun.tools.jps.Jps

-m:显示pid、进程名和主函数启动参数:

PS C:\WINDOWS\system32> jps -m
17472
5384 Jps -m
10204 Launcher D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/idea_rt.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/netty-common-4.1.52.Final.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/maven-builder-support-3.6.1.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/intellij-deps-fastutil-8.4.1-4.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/annotations.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/util.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/plugins/java/lib/maven-resolver-transport-http-1.3.3.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/platform-api.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/commons-logging-1.2.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/netty-transport-4.1.52.Final.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/httpclient-4.5.12.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/gson-2.8.6.jar;D:/develop/IntelliJ
12076 ScannerTest

-v:显示pid、进程名和主函数启动的JVM参数:

PS C:\WINDOWS\system32> jps -v
17472  exit -Xms128m -Xmx2029m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -XX:CICompilerCount=2 -Dsun.io.useCanonPrefixCache=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Djdk.attach.allowAttachSelf -Dkotlinx.coroutines.debug=off -Djdk.module.illegalAccess.silent=true -Djb.vmOptionsFile=C:\Users\songzeceng\AppData\Roaming\JetBrains\IdeaIC2020.3\idea64.exe.vmoptions -Djava.library.path=D:\develop\IntelliJ IDEA Community Edition 2019.1.3\jbr\\bin;D:\develop\IntelliJ IDEA Community Edition 2019.1.3\jbr\\bin\server -Didea.platform.prefix=Idea -Didea.jre.check=true -Dide.native.launcher=true -Didea.vendor.name=JetBrains -Didea.paths.selector=IdeaIC2020.3 -XX:ErrorFile=C:\Users\songzeceng\java_error_in_idea64_%p.log -XX:HeapDumpPath=C:\Users\songzeceng\java_error_in_idea64.hprof

7648 Jps -Dapplication.home=D:\develop\jdk1.8.0_231_x64 -Xms8m
10204 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=D:/develop/ideaWorkspace/JVMDemo -Dpreload.config.path=C:/Users/songzeceng/AppData/Roaming/JetBrains/IdeaIC2020.3/options -Dexternal.project.config=C:\Users\songzeceng\AppData\Local\JetBrains\IdeaIC2020.3\external_build_system\jvmdemo.47d36248 -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-4929924465249296464 -Dfile.encoding=GBK -Duser.language=zh -Duser.country=CN -Didea.paths.selector=IdeaIC2020.3 -Didea.home.path=D:\develop\IntelliJ IDEA Community Edition 2019.1.3 -Didea.config.path=C:\Users\songzeceng\AppData\Roaming\JetBrains\IdeaIC2020.3 -Didea.plugins.path=C:\Users\songzeceng\AppData\Roaming\JetBrains\IdeaIC2020.3\plugins -Djps.log.dir=C:/Users/songzeceng/AppData/Local/JetBrains/IdeaIC2020.3/log/build-log -Djps.fallback.jdk.home=D:/develop/IntelliJ IDEA Community Edition 2019.1.3/jbr -Djps.fallback.jdk.versio

12076 ScannerTest -javaagent:D:\develop\IntelliJ IDEA Community Edition 2019.1.3\lib\idea_rt.jar=61516:D:\develop\IntelliJ IDEA Community Edition 2019.1.3\bin -Dfile.encoding=UTF-8

这些参数都可以综合使用

如果java程序使用-XX:-UsePerfData关闭了UserPerfData参数,那么jps和jstat就不会探知此java进程

运行并测试:

jstat:查看JVM统计信息

可以显示本地或远程JVM进程中的类加载、内存、垃圾收集、JIT编译等运行数据

option参数

类装载相关的

-class:显示ClassLoader相关信息:类的装载、卸载数量、总空间、类装载耗时等

PS C:\WINDOWS\system32> jps
11280 ScannerTest
17472
2904 Jps
4760 Launcher

PS C:\WINDOWS\system32> jstat -class 11280 # 11280为JVM进程的pid
Loaded  Bytes  Unloaded  Bytes     Time
   656  1297.2        0     0.0       0.10

垃圾回收相关的

测试程序及说明:

import java.util.ArrayList;

// JVM参数:-Xmx60m -Xms60m -XX:SurvivorRatio=8
public class GCTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            byte[] arr = new byte[1024 * 100];
            list.add(arr);
            try {
                Thread.sleep(120);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

堆总共60M,新生代和老年代默认比例为1:2,那么新生代20M,老年代40M;而两个幸存者区和伊甸园区的比例为1:1:8,所以s0、s1均为2M,伊甸园区为16M

-gc:显示与gc相关的堆信息,包括伊甸园区、两个村获取、老年代、永久代等的容量、已用空间、GC的时间合计等

PS C:\WINDOWS\system32> jps
17472
15956 Jps
4772 Launcher
9828 GCTest

PS C:\WINDOWS\system32> jstat -gc 9828 1000 10
S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
2048.0 2048.0  0.0   2016.2 16384.0   9319.2   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  10219.3   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  11019.5   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  11919.6   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  12719.7   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  13519.9   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  14320.0   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  15120.1   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0   2016.2 16384.0  16020.2   40960.0    13150.0   4864.0 3227.2 512.0  349.5       1    0.003   0      0.000    0.003
2048.0 2048.0  0.0    0.0   16384.0   848.3    40960.0    31234.1   4864.0 3227.6 512.0  349.5       2    0.007   1      0.008    0.015

可以看到S0C和S1C反映的是两个幸存者区的容量:2M;S0U和S1U反映的是两个幸存者区已使用的空间,幸存者0区没有使用,而幸存者1区快用完了;EC表示伊甸园区容量16M,EU反映的是伊甸园区已使用的容量,可见发生了新生代GC后,新生代已使用的容量骤降(16020.2->848.3);OC表示老年代容量40M,OU表示老年代已使用的容量;MC和MU分别表示方法区的可用空间和已用空间,CCSC和CCSU表示压缩类的可用空间和已用空间;YGC表示新生代GC次数,YGCT表示新生代GC的总耗时;FGC表示Full GC次数,FGCT表示Full GC总耗时,GCT则为GC总耗时

我们可以每隔一段时间查看一组OU的最小值,如果此值越来越大,那么就意味着无法回收的对象越来越多,可能发生了内存泄漏

-gccapacity:基本和-gc相同,更关注java对各个区使用到的最大最小空间

-gcutil:基本和-gc相同,更关注已使用空间占总空间的百分比

PS C:\WINDOWS\system32> jstat -gcutil 14356 1000 20
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00  99.82   9.88  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  15.37  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  20.25  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  25.14  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  30.63  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  35.51  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  40.40  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  45.89  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  50.78  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00  99.82  55.66  31.63  66.35  68.26      1    0.003     0    0.000    0.003
  0.00   0.00  41.02  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  46.52  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  51.40  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  56.29  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  61.78  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  66.66  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  71.55  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  76.43  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  81.92  76.26  66.36  68.26      2    0.007     1    0.008    0.015
  0.00   0.00  86.81  76.26  66.36  68.26      2    0.007     1    0.008    0.015

-gccause:功能和-gcutil一样,只是会额外输出导致最后一次gc或当前gc产生的原因

PS C:\WINDOWS\system32> jstat -gccause 15632 1000 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
  0.00   0.00  87.96   0.00  17.34  19.94      0    0.000     0    0.000    0.000 No GC                No GC
  0.00   0.00  93.46   0.00  17.34  19.94      0    0.000     0    0.000    0.000 No GC                No GC
  0.00   0.00  98.34   0.00  17.34  19.94      0    0.000     0    0.000    0.000 No GC                No GC
  0.00  99.43   3.77  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43   9.26  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43  14.15  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43  19.03  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43  23.92  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43  29.41  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC
  0.00  99.43  34.29  31.96  66.35  68.26      1    0.003     0    0.000    0.003 Allocation Failure   No GC

可见都是Allocation Failure(新生代分配失败)

-gcnew:显示新生代GC的状况

-gcnewcapacity:显示内容和-gcnew基本相同,但更关注使用到的最大最小空间

-gcold:显示老年代GC状况

-gcoldcapacity:显示内容和-gcold基本相同,但更关注使用到的最大最小空间

-gcpermcapacity:显示永久代使用到的最大最小空间

JIT相关的

-compiler:显示JIT编译器编译过的方法、耗时等信息

PS C:\WINDOWS\system32> jstat -compiler 11280
Compiled Failed Invalid   Time   FailedType FailedMethod
      56      0       0     0.01          0

-printcompilation:输出已经被JIT编译的方法

PS C:\WINDOWS\system32> jstat -printcompilation 11280Compiled  Size  Type Method      56      5    1 java/nio/Buffer position

interval参数

用于指定输出统计数据的周期间隔,单位为毫秒

PS C:\WINDOWS\system32> jstat -class 11280 1000
Loaded  Bytes  Unloaded  Bytes     Time
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
.....

count参数

用于指定查询的总次数,比如每间隔1s查询一次,总共查询10次

PS C:\WINDOWS\system32> jstat -class 11280 1000 10
Loaded  Bytes  Unloaded  Bytes     Time
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
   656  1297.2        0     0.0       0.10
PS C:\WINDOWS\system32>

-t参数

显示从程序开始执行到本次输出经过的时间,单位为秒

PS C:\WINDOWS\system32> jstat -class -t 11280
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
          259.4    656  1297.2        0     0.0       0.10

和count、interval配合测试:

PS C:\WINDOWS\system32> jstat -class -t 11280 1000 5
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
          322.9    656  1297.2        0     0.0       0.10
          324.0    656  1297.2        0     0.0       0.10
          325.0    656  1297.2        0     0.0       0.10
          325.9    656  1297.2        0     0.0       0.10
          327.0    656  1297.2        0     0.0       0.10
PS C:\WINDOWS\system32>

-h参数

指定每隔多少次输出就输出一次标头:

PS C:\WINDOWS\system32> jstat -class -t -h3 11280 1000 5
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
          400.0    656  1297.2        0     0.0       0.10
          401.1    656  1297.2        0     0.0       0.10
          402.1    656  1297.2        0     0.0       0.10
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
          403.1    656  1297.2        0     0.0       0.10
          404.1    656  1297.2        0     0.0       0.10
PS C:\WINDOWS\system32>

jinfo:实时查看和修改JVM参数

与jps -v的区别

jps -v只能查看我们显式设置的VM参数,而jinfo可以查看并修改所有的JVM参数

查看参数

jinfo -sysprops PID

查看系统参数

PS C:\WINDOWS\system32>jps
17472
12452 Jps
7940 Launcher
15052 GCTest

PS C:\WINDOWS\system32> jinfo -sysprops 15052
Attaching to process ID 15052, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.231-b11
sun.boot.library.path = D:\develop\jdk1.8.0_231_x64\jre\bin
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = ;
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level =
sun.java.launcher = SUN_STANDARD
user.script =
user.country = CN
user.dir = D:\develop\ideaWorkspace\JVMDemo
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.8.0_231-b11
java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = D:\develop\jdk1.8.0_231_x64\jre\lib\endorsed
line.separator =


java.io.tmpdir = C:\WINDOWS\TEMP\
java.vm.specification.vendor = Oracle Corporation
user.variant =
os.name = Windows 10
sun.jnu.encoding = GBK
java.library.path = D:\develop\jdk1.8.0_231_x64\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp;C:\ProgramData\Oracle\Java\javapath;D:\develop\xftp6\;D:\develop\Xshell6\;D:\develop\Python\Python37\Scripts\;D:\develop\Python\Python37\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\;C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;D:\develop\scala-2.11.12\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;D:\develop\nodejs\;D:\develop\LLVM\bin;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;D:\develop\Go\bin;D:\develop\Subversion\bin;C:\Program Files\NVIDIA Corporation\Nsight Compute 2019.5.0\;D:\develop\Miniconda3;D:\develop\Miniconda3\Scripts;C:\Program Files\MySQL\MySQL Server 5.7\bin;D:\develop\Git\bin;D:\develop\maven\apache-maven-3.6.1\bin;D:\develop\scala-2.11.12\bin;D:\develop\Graphviz2.38\bin;D:\develop\neo4j-community-3.3.1-windows\neo4j-community-3.3.1\bin;D:\develop\flutter\flutter\bin;C:\Users\songzeceng\AppData\Roaming\npm;D:\develop\Android\sdk\platform-tools;D:\develop\mingw-w64\mingw64\bin;D:\develop\LLVM\bin;C:\Users\songzeceng\AppData\Local\Microsoft\WindowsApps;D:\develop\gzip-1.3.12-1-bin\bin;D:\develop\MinGW\bin;D:\develop\Miniconda3\Lib\site-packages\torch\lib;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64;D:\develop\lua-5.3.5;D:\develop\flink-1.7.2\bin;D:\develop\jdk1.8.0_231_x64\bin;D:\develop\groovy-2.4.18\bin;C:\Users\songzeceng\go\bin;D:\develop\Microsoft VS Code\bin;D:\develop\PyCharm 2020.2.2\bin;;D:\develop\CLion 2020.2.4\bin;;C:\Windows\System32\;;.
java.specification.name = Java Platform API Specification
java.class.version = 52.0
sun.management.compiler = HotSpot 64-Bit Tiered Compilers
os.version = 10.0
user.home = C:\Users\songzeceng
user.timezone =
java.awt.printerjob = sun.awt.windows.WPrinterJob
file.encoding = UTF-8
java.specification.version = 1.8
user.name = songzeceng
java.class.path = D:\develop\jdk1.8.0_231_x64\jre\lib\charsets.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\deploy.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\access-bridge-64.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\cldrdata.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\dnsns.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\jaccess.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\jfxrt.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\localedata.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\nashorn.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\sunec.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\sunjce_provider.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\sunmscapi.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\sunpkcs11.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\ext\zipfs.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\javaws.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jce.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jfr.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jfxswt.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jsse.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\management-agent.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\plugin.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\resources.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\rt.jar;D:\develop\ideaWorkspace\JVMDemo\target\classes;D:\develop\IntelliJ IDEA Community Edition 2019.1.3\lib\idea_rt.jar
java.vm.specification.version = 1.8
sun.arch.data.model = 64
sun.java.command = GCTest
java.home = D:\develop\jdk1.8.0_231_x64\jre
user.language = zh
java.specification.vendor = Oracle Corporation
awt.toolkit = sun.awt.windows.WToolkit
java.vm.info = mixed mode
java.version = 1.8.0_231
java.ext.dirs = D:\develop\jdk1.8.0_231_x64\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext
sun.boot.class.path = D:\develop\jdk1.8.0_231_x64\jre\lib\resources.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\rt.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\sunrsasign.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jsse.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jce.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\charsets.jar;D:\develop\jdk1.8.0_231_x64\jre\lib\jfr.jar;D:\develop\jdk1.8.0_231_x64\jre\classes
java.vendor = Oracle Corporation
file.separator = \
java.vendor.url.bug = http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding = UnicodeLittle
sun.cpu.endian = little
sun.desktop = windows
sun.cpu.isalist = amd64
PS C:\WINDOWS\system32> 

jinfo -flags PID

查看某JVM进程的JVM参数:

PS C:\WINDOWS\system32> jps
17472
11192 Launcher
16444 ScannerTest
4652 Jps

PS C:\WINDOWS\system32> jinfo -flags 16444
Attaching to process ID 16444, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=62914560 -XX:MaxHeapSize=62914560 -XX:MaxNewSize=20971520 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=20971520 -XX:OldSize=41943040 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -Xmx60m -Xms60m -javaagent:D:\develop\IntelliJ IDEA Community Edition 2019.1.3\lib\idea_rt.jar=64996:D:\develop\IntelliJ IDEA Community Edition 2019.1.3\bin -Dfile.encoding=UTF-8

jinfo -flag 具体参数 PID

查看某JVM进程某个具体参数值:

PS C:\WINDOWS\system32> jinfo -flag UseG1GC 16444
-XX:-UseG1GC

PS C:\WINDOWS\system32> jinfo -flag MaxHeapSize 16444
-XX:MaxHeapSize=62914560

修改参数

只能修改被标记为manageable的flag并立刻生效

PS C:\WINDOWS\system32> jinfo -flag PrintGCDetails 16444
-XX:-PrintGCDetails

PS C:\WINDOWS\system32> jinfo -flag +PrintGCDetails 16444

然后再查看一下

PS C:\WINDOWS\system32> jinfo -flag PrintGCDetails 16444
-XX:+PrintGCDetails

再修改一个数值类型的参数

PS C:\WINDOWS\system32> jinfo -flag MaxHeapFreeRatio 16444
-XX:MaxHeapFreeRatio=100

PS C:\WINDOWS\system32> jinfo -flag MaxHeapFreeRatio=60 16444

查看是否生效:

PS C:\WINDOWS\system32> jinfo -flag MaxHeapFreeRatio 16444
-XX:MaxHeapFreeRatio=60

进程结束后,jinfo对VM参数的修改就失效了

PS C:\WINDOWS\system32> jps
17472
4080 ScannerTest
6656 Launcher
12152 Jps

PS C:\WINDOWS\system32> jinfo -flag MaxHeapFreeRatio 4080
-XX:MaxHeapFreeRatio=100

拓展

-XX:+PrintFlagsInitial

查看所有JVM参数初始值

-XX:+PrintFlagsFinal

查看所有JVM参数最终值

PS C:\WINDOWS\system32> java -XX:+PrintFlagsFinal
[Global flags]
     intx ActiveProcessorCount                      = -1                                  {product}
    uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
    uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
    uintx AdaptiveSizePausePolicy                   = 0                                   {product}
    uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
    uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
    uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
    uintx AdaptiveSizePolicyWeight                  = 10                                  {product}
    uintx AdaptiveSizeThroughPutPolicy              = 0                                   {product}
    uintx AdaptiveTimeWeight                        = 25                                  {product}
     bool AdjustConcurrency                         = false                               {product}
     bool AggressiveHeap                            = false                               {product}
     bool AggressiveOpts                            = false                               {product}
     intx AliasLevel                                = 3                                   {C2 product}
     bool AlignVector                               = false                               {C2 product}
     intx AllocateInstancePrefetchLines             = 1                                   {product}
     intx AllocatePrefetchDistance                  = 192                                 {product}
     intx AllocatePrefetchInstr                     = 3                                   {product}
     intx AllocatePrefetchLines                     = 4                                   {product}
     intx AllocatePrefetchStepSize                  = 64                                  {product}
     intx AllocatePrefetchStyle                     = 1                                   {product}
     bool AllowJNIEnvProxy                          = false                               {product}
     bool AllowNonVirtualCalls                      = false                               {product}
     bool AllowParallelDefineClass                  = false                               {product}
     bool AllowUserSignalHandlers                   = false                               {product}
     bool AlwaysActAsServerClassMachine             = false                               {product}
     bool AlwaysCompileLoopMethods                  = false                               {product}
     bool AlwaysLockClassLoader                     = false                               {product}
     bool AlwaysPreTouch                            = false                               {product}
     bool AlwaysRestoreFPU                          = false                               {product}
     bool AlwaysTenure                              = false                               {product}
     bool AssertOnSuspendWaitFailure                = false                               {product}
     bool AssumeMP                                  = false                               {product}
     intx AutoBoxCacheMax                           = 128                                 {C2 product}
    uintx AutoGCSelectPauseMillis                   = 5000                                {product}
     intx BCEATraceLevel                            = 0                                   {product}
     intx BackEdgeThreshold                         = 100000                              {pd product}
     bool BackgroundCompilation                     = true                                {pd product}
    uintx BaseFootPrintEstimate                     = 268435456                           {product}
     intx BiasedLockingBulkRebiasThreshold          = 20                                  {product}
     intx BiasedLockingBulkRevokeThreshold          = 40                                  {product}
     intx BiasedLockingDecayTime                    = 25000                               {product}
     intx BiasedLockingStartupDelay                 = 4000                                {product}
     bool BindGCTaskThreadsToCPUs                   = false                               {product}
     bool BlockLayoutByFrequency                    = true                                {C2 product}
     intx BlockLayoutMinDiamondPercentage           = 20                                  {C2 product}
     bool BlockLayoutRotateLoops                    = true                                {C2 product}
     bool BranchOnRegister                          = false                               {C2 product}
     bool BytecodeVerificationLocal                 = false                               {product}
     bool BytecodeVerificationRemote                = true                                {product}
     bool C1OptimizeVirtualCallProfiling            = true                                {C1 product}
     bool C1ProfileBranches                         = true                                {C1 product}
     bool C1ProfileCalls                            = true                                {C1 product}
     bool C1ProfileCheckcasts                       = true                                {C1 product}
     bool C1ProfileInlinedCalls                     = true                                {C1 product}
     bool C1ProfileVirtualCalls                     = true                                {C1 product}
     bool C1UpdateMethodData                        = true                                {C1 product}
     intx CICompilerCount                          := 4                                   {product}
     bool CICompilerCountPerCPU                     = true                                {product}
     bool CITime                                    = false                               {product}
     bool CMSAbortSemantics                         = false                               {product}
    uintx CMSAbortablePrecleanMinWorkPerIteration   = 100                                 {product}
     intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
    uintx CMSBitMapYieldQuantum                     = 10485760                            {product}
    uintx CMSBootstrapOccupancy                     = 50                                  {product}
     bool CMSClassUnloadingEnabled                  = true                                {product}
    uintx CMSClassUnloadingMaxInterval              = 0                                   {product}
     bool CMSCleanOnEnter                           = true                                {product}
     bool CMSCompactWhenClearAllSoftRefs            = true                                {product}
    uintx CMSConcMarkMultiple                       = 32                                  {product}
     bool CMSConcurrentMTEnabled                    = true                                {product}
    uintx CMSCoordinatorYieldSleepCount             = 10                                  {product}
     bool CMSDumpAtPromotionFailure                 = false                               {product}
     bool CMSEdenChunksRecordAlways                 = true                                {product}
    uintx CMSExpAvgFactor                           = 50                                  {product}
     bool CMSExtrapolateSweep                       = false                               {product}
    uintx CMSFullGCsBeforeCompaction                = 0                                   {product}
    uintx CMSIncrementalDutyCycle                   = 10                                  {product}
    uintx CMSIncrementalDutyCycleMin                = 0                                   {product}
     bool CMSIncrementalMode                        = false                               {product}
    uintx CMSIncrementalOffset                      = 0                                   {product}
     bool CMSIncrementalPacing                      = true                                {product}
    uintx CMSIncrementalSafetyFactor                = 10                                  {product}
    uintx CMSIndexedFreeListReplenish               = 4                                   {product}
     intx CMSInitiatingOccupancyFraction            = -1                                  {product}
    uintx CMSIsTooFullPercentage                    = 98                                  {product}
   double CMSLargeCoalSurplusPercent                = 0.950000                            {product}
   double CMSLargeSplitSurplusPercent               = 1.000000                            {product}
     bool CMSLoopWarn                               = false                               {product}
    uintx CMSMaxAbortablePrecleanLoops              = 0                                   {product}
     intx CMSMaxAbortablePrecleanTime               = 5000                                {product}
    uintx CMSOldPLABMax                             = 1024                                {product}
    uintx CMSOldPLABMin                             = 16                                  {product}
    uintx CMSOldPLABNumRefills                      = 4                                   {product}
    uintx CMSOldPLABReactivityFactor                = 2                                   {product}
     bool CMSOldPLABResizeQuicker                   = false                               {product}
    uintx CMSOldPLABToleranceFactor                 = 4                                   {product}
     bool CMSPLABRecordAlways                       = true                                {product}
    uintx CMSParPromoteBlocksToClaim                = 16                                  {product}
     bool CMSParallelInitialMarkEnabled             = true                                {product}
     bool CMSParallelRemarkEnabled                  = true                                {product}
     bool CMSParallelSurvivorRemarkEnabled          = true                                {product}
    uintx CMSPrecleanDenominator                    = 3                                   {product}
    uintx CMSPrecleanIter                           = 3                                   {product}
    uintx CMSPrecleanNumerator                      = 2                                   {product}
     bool CMSPrecleanRefLists1                      = true                                {product}
     bool CMSPrecleanRefLists2                      = false                               {product}
     bool CMSPrecleanSurvivors1                     = false                               {product}
     bool CMSPrecleanSurvivors2                     = true                                {product}
    uintx CMSPrecleanThreshold                      = 1000                                {product}
     bool CMSPrecleaningEnabled                     = true                                {product}
     bool CMSPrintChunksInDump                      = false                               {product}
     bool CMSPrintEdenSurvivorChunks                = false                               {product}
     bool CMSPrintObjectsInDump                     = false                               {product}
    uintx CMSRemarkVerifyVariant                    = 1                                   {product}
     bool CMSReplenishIntermediate                  = true                                {product}
    uintx CMSRescanMultiple                         = 32                                  {product}
    uintx CMSSamplingGrain                          = 16384                               {product}
     bool CMSScavengeBeforeRemark                   = false                               {product}
    uintx CMSScheduleRemarkEdenPenetration          = 50                                  {product}
    uintx CMSScheduleRemarkEdenSizeThreshold        = 2097152                             {product}
    uintx CMSScheduleRemarkSamplingRatio            = 5                                   {product}
   double CMSSmallCoalSurplusPercent                = 1.050000                            {product}
   double CMSSmallSplitSurplusPercent               = 1.100000                            {product}
     bool CMSSplitIndexedFreeListBlocks             = true                                {product}
     intx CMSTriggerInterval                        = -1                                  {manageable}
    uintx CMSTriggerRatio                           = 80                                  {product}
     intx CMSWaitDuration                           = 2000                                {manageable}
    uintx CMSWorkQueueDrainThreshold                = 10                                  {product}
     bool CMSYield                                  = true                                {product}
    uintx CMSYieldSleepCount                        = 0                                   {product}
    uintx CMSYoungGenPerWorker                      = 67108864                            {pd product}
    uintx CMS_FLSPadding                            = 1                                   {product}
    uintx CMS_FLSWeight                             = 75                                  {product}
    uintx CMS_SweepPadding                          = 1                                   {product}
    uintx CMS_SweepTimerThresholdMillis             = 10                                  {product}
    uintx CMS_SweepWeight                           = 75                                  {product}
     bool CheckEndorsedAndExtDirs                   = false                               {product}
     bool CheckJNICalls                             = false                               {product}
     bool ClassUnloading                            = true                                {product}
     bool ClassUnloadingWithConcurrentMark          = true                                {product}
     intx ClearFPUAtPark                            = 0                                   {product}
     bool ClipInlining                              = true                                {product}
    uintx CodeCacheExpansionSize                    = 65536                               {pd product}
    uintx CodeCacheMinimumFreeSpace                 = 512000                              {product}
     bool CollectGen0First                          = false                               {product}
     bool CompactFields                             = true                                {product}
     intx CompilationPolicyChoice                   = 3                                   {product}
ccstrlist CompileCommand                            =                                     {product}
    ccstr CompileCommandFile                        =                                     {product}
ccstrlist CompileOnly                               =                                     {product}
     intx CompileThreshold                          = 10000                               {pd product}
     bool CompilerThreadHintNoPreempt               = true                                {product}
     intx CompilerThreadPriority                    = -1                                  {product}
     intx CompilerThreadStackSize                   = 0                                   {pd product}
    uintx CompressedClassSpaceSize                  = 1073741824                          {product}
    uintx ConcGCThreads                             = 0                                   {product}
     intx ConditionalMoveLimit                      = 3                                   {C2 pd product}
     intx ContendedPaddingWidth                     = 128                                 {product}
     bool ConvertSleepToYield                       = true                                {pd product}
     bool ConvertYieldToSleep                       = false                               {product}
     bool CrashOnOutOfMemoryError                   = false                               {product}
     bool CreateMinidumpOnCrash                     = false                               {product}
     bool CriticalJNINatives                        = true                                {product}
     bool DTraceAllocProbes                         = false                               {product}
     bool DTraceMethodProbes                        = false                               {product}
     bool DTraceMonitorProbes                       = false                               {product}
     bool Debugging                                 = false                               {product}
    uintx DefaultMaxRAMFraction                     = 4                                   {product}
     intx DefaultThreadPriority                     = -1                                  {product}
     intx DeferPollingPageLoopCount                 = -1                                  {product}
     intx DeferThrSuspendLoopCount                  = 4000                                {product}
     bool DeoptimizeRandom                          = false                               {product}
     bool DisableAttachMechanism                    = false                               {product}
     bool DisableExplicitGC                         = false                               {product}
     bool DisplayVMOutputToStderr                   = false                               {product}
     bool DisplayVMOutputToStdout                   = false                               {product}
     bool DoEscapeAnalysis                          = true                                {C2 product}
     bool DontCompileHugeMethods                    = true                                {product}
     bool DontYieldALot                             = false                               {pd product}
    ccstr DumpLoadedClassList                       =                                     {product}
     bool DumpReplayDataOnError                     = true                                {product}
     bool DumpSharedSpaces                          = false                               {product}
     bool EagerXrunInit                             = false                               {product}
     intx EliminateAllocationArraySizeLimit         = 64                                  {C2 product}
     bool EliminateAllocations                      = true                                {C2 product}
     bool EliminateAutoBox                          = true                                {C2 product}
     bool EliminateLocks                            = true                                {C2 product}
     bool EliminateNestedLocks                      = true                                {C2 product}
     intx EmitSync                                  = 0                                   {product}
     bool EnableContended                           = true                                {product}
     bool EnableResourceManagementTLABCache         = true                                {product}
     bool EnableSharedLookupCache                   = true                                {product}
     bool EnableTracing                             = false                               {product}
    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    ccstr ErrorFile                                 =                                     {product}
    ccstr ErrorReportServer                         =                                     {product}
   double EscapeAnalysisTimeout                     = 20.000000                           {C2 product}
     bool EstimateArgEscape                         = true                                {product}
     bool ExitOnOutOfMemoryError                    = false                               {product}
     bool ExplicitGCInvokesConcurrent               = false                               {product}
     bool ExplicitGCInvokesConcurrentAndUnloadsClasses  = false                               {product}
     bool ExtendedDTraceProbes                      = false                               {product}
    ccstr ExtraSharedClassListFile                  =                                     {product}
     bool FLSAlwaysCoalesceLarge                    = false                               {product}
    uintx FLSCoalescePolicy                         = 2                                   {product}
   double FLSLargestBlockCoalesceProximity          = 0.990000                            {product}
     bool FailOverToOldVerifier                     = true                                {product}
     bool FastTLABRefill                            = true                                {product}
     intx FenceInstruction                          = 0                                   {ARCH product}
     intx FieldsAllocationStyle                     = 1                                   {product}
     bool FilterSpuriousWakeups                     = true                                {product}
    ccstr FlightRecorderOptions                     =                                     {product}
     bool ForceNUMA                                 = false                               {product}
     bool ForceTimeHighResolution                   = false                               {product}
     intx FreqInlineSize                            = 325                                 {pd product}
   double G1ConcMarkStepDurationMillis              = 10.000000                           {product}
    uintx G1ConcRSHotCardLimit                      = 4                                   {product}
    uintx G1ConcRSLogCacheSize                      = 10                                  {product}
     intx G1ConcRefinementGreenZone                 = 0                                   {product}
     intx G1ConcRefinementRedZone                   = 0                                   {product}
     intx G1ConcRefinementServiceIntervalMillis     = 300                                 {product}
    uintx G1ConcRefinementThreads                   = 0                                   {product}
     intx G1ConcRefinementThresholdStep             = 0                                   {product}
     intx G1ConcRefinementYellowZone                = 0                                   {product}
    uintx G1ConfidencePercent                       = 50                                  {product}
    uintx G1HeapRegionSize                          = 0                                   {product}
    uintx G1HeapWastePercent                        = 5                                   {product}
    uintx G1MixedGCCountTarget                      = 8                                   {product}
     intx G1RSetRegionEntries                       = 0                                   {product}
    uintx G1RSetScanBlockSize                       = 64                                  {product}
     intx G1RSetSparseRegionEntries                 = 0                                   {product}
     intx G1RSetUpdatingPauseTimePercent            = 10                                  {product}
     intx G1RefProcDrainInterval                    = 10                                  {product}
    uintx G1ReservePercent                          = 10                                  {product}
    uintx G1SATBBufferEnqueueingThresholdPercent    = 60                                  {product}
     intx G1SATBBufferSize                          = 1024                                {product}
     intx G1UpdateBufferSize                        = 256                                 {product}
     bool G1UseAdaptiveConcRefinement               = true                                {product}
    uintx GCDrainStackTargetSize                    = 64                                  {product}
    uintx GCHeapFreeLimit                           = 2                                   {product}
    uintx GCLockerEdenExpansionPercent              = 5                                   {product}
     bool GCLockerInvokesConcurrent                 = false                               {product}
    uintx GCLogFileSize                             = 8192                                {product}
    uintx GCPauseIntervalMillis                     = 0                                   {product}
    uintx GCTaskTimeStampEntries                    = 200                                 {product}
    uintx GCTimeLimit                               = 98                                  {product}
    uintx GCTimeRatio                               = 99                                  {product}
    uintx HeapBaseMinAddress                        = 2147483648                          {pd product}
     bool HeapDumpAfterFullGC                       = false                               {manageable}
     bool HeapDumpBeforeFullGC                      = false                               {manageable}
     bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
    ccstr HeapDumpPath                              =                                     {manageable}
    uintx HeapFirstMaximumCompactionCount           = 3                                   {product}
    uintx HeapMaximumCompactionInterval             = 20                                  {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
     bool IgnoreEmptyClassPaths                     = false                               {product}
     bool IgnoreUnrecognizedVMOptions               = false                               {product}
    uintx IncreaseFirstTierCompileThresholdAt       = 50                                  {product}
     bool IncrementalInline                         = true                                {C2 product}
    uintx InitialBootClassLoaderMetaspaceSize       = 4194304                             {product}
    uintx InitialCodeCacheSize                      = 2555904                             {pd product}
    uintx InitialHeapSize                          := 266338304                           {product}
    uintx InitialRAMFraction                        = 64                                  {product}
   double InitialRAMPercentage                      = 1.562500                            {product}
    uintx InitialSurvivorRatio                      = 8                                   {product}
    uintx InitialTenuringThreshold                  = 7                                   {product}
    uintx InitiatingHeapOccupancyPercent            = 45                                  {product}
     bool Inline                                    = true                                {product}
    ccstr InlineDataFile                            =                                     {product}
     intx InlineSmallCode                           = 2000                                {pd product}
     bool InlineSynchronizedMethods                 = true                                {C1 product}
     bool InsertMemBarAfterArraycopy                = true                                {C2 product}
     intx InteriorEntryAlignment                    = 16                                  {C2 pd product}
     intx InterpreterProfilePercentage              = 33                                  {product}
     bool JNIDetachReleasesMonitors                 = true                                {product}
     bool JavaMonitorsInStackTrace                  = true                                {product}
     intx JavaPriority10_To_OSPriority              = -1                                  {product}
     intx JavaPriority1_To_OSPriority               = -1                                  {product}
     intx JavaPriority2_To_OSPriority               = -1                                  {product}
     intx JavaPriority3_To_OSPriority               = -1                                  {product}
     intx JavaPriority4_To_OSPriority               = -1                                  {product}
     intx JavaPriority5_To_OSPriority               = -1                                  {product}
     intx JavaPriority6_To_OSPriority               = -1                                  {product}
     intx JavaPriority7_To_OSPriority               = -1                                  {product}
     intx JavaPriority8_To_OSPriority               = -1                                  {product}
     intx JavaPriority9_To_OSPriority               = -1                                  {product}
     bool LIRFillDelaySlots                         = false                               {C1 pd product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx LargePageSizeInBytes                      = 0                                   {product}
     bool LazyBootClassLoader                       = true                                {product}
     intx LiveNodeCountInliningCutoff               = 40000                               {C2 product}
     bool LogCommercialFeatures                     = false                               {product}
     intx LoopMaxUnroll                             = 16                                  {C2 product}
     intx LoopOptsCount                             = 43                                  {C2 product}
     intx LoopUnrollLimit                           = 60                                  {C2 pd product}
     intx LoopUnrollMin                             = 4                                   {C2 product}
     bool LoopUnswitching                           = true                                {C2 product}
     bool ManagementServer                          = false                               {product}
    uintx MarkStackSize                             = 4194304                             {product}
    uintx MarkStackSizeMax                          = 536870912                           {product}
    uintx MarkSweepAlwaysCompactCount               = 4                                   {product}
    uintx MarkSweepDeadRatio                        = 1                                   {product}
     intx MaxBCEAEstimateLevel                      = 5                                   {product}
     intx MaxBCEAEstimateSize                       = 150                                 {product}
    uintx MaxDirectMemorySize                       = 0                                   {product}
     bool MaxFDLimit                                = true                                {product}
    uintx MaxGCMinorPauseMillis                     = 4294967295                          {product}
    uintx MaxGCPauseMillis                          = 4294967295                          {product}
    uintx MaxHeapFreeRatio                          = 100                                 {manageable}
    uintx MaxHeapSize                              := 4257218560                          {product}
     intx MaxInlineLevel                            = 9                                   {product}
     intx MaxInlineSize                             = 35                                  {product}
     intx MaxJNILocalCapacity                       = 65536                               {product}
     intx MaxJavaStackTraceDepth                    = 1024                                {product}
     intx MaxJumpTableSize                          = 65000                               {C2 product}
     intx MaxJumpTableSparseness                    = 5                                   {C2 product}
     intx MaxLabelRootDepth                         = 1100                                {C2 product}
     intx MaxLoopPad                                = 11                                  {C2 product}
    uintx MaxMetaspaceExpansion                     = 5451776                             {product}
    uintx MaxMetaspaceFreeRatio                     = 70                                  {product}
    uintx MaxMetaspaceSize                          = 4294901760                          {product}
    uintx MaxNewSize                               := 1418723328                          {product}
     intx MaxNodeLimit                              = 75000                               {C2 product}
uint64_t MaxRAM                                    = 0                                   {pd product}
    uintx MaxRAMFraction                            = 4                                   {product}
   double MaxRAMPercentage                          = 25.000000                           {product}
     intx MaxRecursiveInlineLevel                   = 1                                   {product}
    uintx MaxTenuringThreshold                      = 15                                  {product}
     intx MaxTrivialSize                            = 6                                   {product}
     intx MaxVectorSize                             = 32                                  {C2 product}
    uintx MetaspaceSize                             = 21807104                            {pd product}
     bool MethodFlushing                            = true                                {product}
    uintx MinHeapDeltaBytes                        := 524288                              {product}
    uintx MinHeapFreeRatio                          = 0                                   {manageable}
     intx MinInliningThreshold                      = 250                                 {product}
     intx MinJumpTableSize                          = 10                                  {C2 pd product}
    uintx MinMetaspaceExpansion                     = 339968                              {product}
    uintx MinMetaspaceFreeRatio                     = 40                                  {product}
    uintx MinRAMFraction                            = 2                                   {product}
   double MinRAMPercentage                          = 50.000000                           {product}
    uintx MinSurvivorRatio                          = 3                                   {product}
    uintx MinTLABSize                               = 2048                                {product}
     intx MonitorBound                              = 0                                   {product}
     bool MonitorInUseLists                         = false                               {product}
     intx MultiArrayExpandLimit                     = 6                                   {C2 product}
     bool MustCallLoadClassInternal                 = false                               {product}
    uintx NUMAChunkResizeWeight                     = 20                                  {product}
    uintx NUMAInterleaveGranularity                 = 2097152                             {product}
    uintx NUMAPageScanRate                          = 256                                 {product}
    uintx NUMASpaceResizeRate                       = 1073741824                          {product}
     bool NUMAStats                                 = false                               {product}
    ccstr NativeMemoryTracking                      = off                                 {product}
     bool NeedsDeoptSuspend                         = false                               {pd product}
     bool NeverActAsServerClassMachine              = false                               {pd product}
     bool NeverTenure                               = false                               {product}
    uintx NewRatio                                  = 2                                   {product}
    uintx NewSize                                  := 88604672                            {product}
    uintx NewSizeThreadIncrease                     = 5320                                {pd product}
     intx NmethodSweepActivity                      = 10                                  {product}
     intx NmethodSweepCheckInterval                 = 5                                   {product}
     intx NmethodSweepFraction                      = 16                                  {product}
     intx NodeLimitFudgeFactor                      = 2000                                {C2 product}
    uintx NumberOfGCLogFiles                        = 0                                   {product}
     intx NumberOfLoopInstrToAlign                  = 4                                   {C2 product}
     intx ObjectAlignmentInBytes                    = 8                                   {lp64_product}
    uintx OldPLABSize                               = 1024                                {product}
    uintx OldPLABWeight                             = 50                                  {product}
    uintx OldSize                                  := 177733632                           {product}
     bool OmitStackTraceInFastThrow                 = true                                {product}
ccstrlist OnError                                   =                                     {product}
ccstrlist OnOutOfMemoryError                        =                                     {product}
     intx OnStackReplacePercentage                  = 140                                 {pd product}
     bool OptimizeFill                              = true                                {C2 product}
     bool OptimizePtrCompare                        = true                                {C2 product}
     bool OptimizeStringConcat                      = true                                {C2 product}
     bool OptoBundling                              = false                               {C2 pd product}
     intx OptoLoopAlignment                         = 16                                  {pd product}
     bool OptoScheduling                            = false                               {C2 pd product}
    uintx PLABWeight                                = 75                                  {product}
     bool PSChunkLargeArrays                        = true                                {product}
     intx ParGCArrayScanChunk                       = 50                                  {product}
    uintx ParGCDesiredObjsFromOverflowList          = 20                                  {product}
     bool ParGCTrimOverflow                         = true                                {product}
     bool ParGCUseLocalOverflow                     = false                               {product}
    uintx ParallelGCBufferWastePct                  = 10                                  {product}
    uintx ParallelGCThreads                         = 10                                  {product}
     bool ParallelGCVerbose                         = false                               {product}
    uintx ParallelOldDeadWoodLimiterMean            = 50                                  {product}
    uintx ParallelOldDeadWoodLimiterStdDev          = 80                                  {product}
     bool ParallelRefProcBalancingEnabled           = true                                {product}
     bool ParallelRefProcEnabled                    = false                               {product}
     bool PartialPeelAtUnsignedTests                = true                                {C2 product}
     bool PartialPeelLoop                           = true                                {C2 product}
     intx PartialPeelNewPhiDelta                    = 0                                   {C2 product}
    uintx PausePadding                              = 1                                   {product}
     intx PerBytecodeRecompilationCutoff            = 200                                 {product}
     intx PerBytecodeTrapLimit                      = 4                                   {product}
     intx PerMethodRecompilationCutoff              = 400                                 {product}
     intx PerMethodTrapLimit                        = 100                                 {product}
     bool PerfAllowAtExitRegistration               = false                               {product}
     bool PerfBypassFileSystemCheck                 = false                               {product}
     intx PerfDataMemorySize                        = 32768                               {product}
     intx PerfDataSamplingInterval                  = 50                                  {product}
    ccstr PerfDataSaveFile                          =                                     {product}
     bool PerfDataSaveToFile                        = false                               {product}
     bool PerfDisableSharedMem                      = false                               {product}
     intx PerfMaxStringConstLength                  = 1024                                {product}
     intx PreInflateSpin                            = 10                                  {pd product}
     bool PreferInterpreterNativeStubs              = false                               {pd product}
     intx PrefetchCopyIntervalInBytes               = 576                                 {product}
     intx PrefetchFieldsAhead                       = 1                                   {product}
     intx PrefetchScanIntervalInBytes               = 576                                 {product}
     bool PreserveAllAnnotations                    = false                               {product}
     bool PreserveFramePointer                      = false                               {pd product}
    uintx PretenureSizeThreshold                    = 0                                   {product}
     bool PrintAdaptiveSizePolicy                   = false                               {product}
     bool PrintCMSInitiationStatistics              = false                               {product}
     intx PrintCMSStatistics                        = 0                                   {product}
     bool PrintClassHistogram                       = false                               {manageable}
     bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
     bool PrintCodeCache                            = false                               {product}
     bool PrintCodeCacheOnCompilation               = false                               {product}
     bool PrintCommandLineFlags                     = false                               {product}
     bool PrintCompilation                          = false                               {product}
     bool PrintConcurrentLocks                      = false                               {manageable}
     intx PrintFLSCensus                            = 0                                   {product}
     intx PrintFLSStatistics                        = 0                                   {product}
     bool PrintFlagsFinal                          := true                                {product}
     bool PrintFlagsInitial                         = false                               {product}
     bool PrintGC                                   = false                               {manageable}
     bool PrintGCApplicationConcurrentTime          = false                               {product}
     bool PrintGCApplicationStoppedTime             = false                               {product}
     bool PrintGCCause                              = true                                {product}
     bool PrintGCDateStamps                         = false                               {manageable}
     bool PrintGCDetails                            = false                               {manageable}
     bool PrintGCID                                 = false                               {manageable}
     bool PrintGCTaskTimeStamps                     = false                               {product}
     bool PrintGCTimeStamps                         = false                               {manageable}
     bool PrintHeapAtGC                             = false                               {product rw}
     bool PrintHeapAtGCExtended                     = false                               {product rw}
     bool PrintHeapAtSIGBREAK                       = true                                {product}
     bool PrintJNIGCStalls                          = false                               {product}
     bool PrintJNIResolving                         = false                               {product}
     bool PrintOldPLAB                              = false                               {product}
     bool PrintOopAddress                           = false                               {product}
     bool PrintPLAB                                 = false                               {product}
     bool PrintParallelOldGCPhaseTimes              = false                               {product}
     bool PrintPromotionFailure                     = false                               {product}
     bool PrintReferenceGC                          = false                               {product}
     bool PrintSafepointStatistics                  = false                               {product}
     intx PrintSafepointStatisticsCount             = 300                                 {product}
     intx PrintSafepointStatisticsTimeout           = -1                                  {product}
     bool PrintSharedArchiveAndExit                 = false                               {product}
     bool PrintSharedDictionary                     = false                               {product}
     bool PrintSharedSpaces                         = false                               {product}
     bool PrintStringDeduplicationStatistics        = false                               {product}
     bool PrintStringTableStatistics                = false                               {product}
     bool PrintTLAB                                 = false                               {product}
     bool PrintTenuringDistribution                 = false                               {product}
     bool PrintTieredEvents                         = false                               {product}
     bool PrintVMOptions                            = false                               {product}
     bool PrintVMQWaitTime                          = false                               {product}
     bool PrintWarnings                             = true                                {product}
    uintx ProcessDistributionStride                 = 4                                   {product}
     bool ProfileInterpreter                        = true                                {pd product}
     bool ProfileIntervals                          = false                               {product}
     intx ProfileIntervalsTicks                     = 100                                 {product}
     intx ProfileMaturityPercentage                 = 20                                  {product}
     bool ProfileVM                                 = false                               {product}
     bool ProfilerPrintByteCodeStatistics           = false                               {product}
     bool ProfilerRecordPC                          = false                               {product}
    uintx PromotedPadding                           = 3                                   {product}
    uintx QueuedAllocationWarningCount              = 0                                   {product}
    uintx RTMRetryCount                             = 5                                   {ARCH product}
     bool RangeCheckElimination                     = true                                {product}
     intx ReadPrefetchInstr                         = 0                                   {ARCH product}
     bool ReassociateInvariants                     = true                                {C2 product}
     bool ReduceBulkZeroing                         = true                                {C2 product}
     bool ReduceFieldZeroing                        = true                                {C2 product}
     bool ReduceInitialCardMarks                    = true                                {C2 product}
     bool ReduceSignalUsage                         = false                               {product}
     intx RefDiscoveryPolicy                        = 0                                   {product}
     bool ReflectionWrapResolutionErrors            = true                                {product}
     bool RegisterFinalizersAtInit                  = true                                {product}
     bool RelaxAccessControlCheck                   = false                               {product}
    ccstr ReplayDataFile                            =                                     {product}
     bool RequireSharedSpaces                       = false                               {product}
    uintx ReservedCodeCacheSize                     = 251658240                           {pd product}
     bool ResizeOldPLAB                             = true                                {product}
     bool ResizePLAB                                = true                                {product}
     bool ResizeTLAB                                = true                                {pd product}
     bool RestoreMXCSROnJNICalls                    = false                               {product}
     bool RestrictContended                         = true                                {product}
     bool RewriteBytecodes                          = true                                {pd product}
     bool RewriteFrequentPairs                      = true                                {pd product}
     intx SafepointPollOffset                       = 256                                 {C1 pd product}
     intx SafepointSpinBeforeYield                  = 2000                                {product}
     bool SafepointTimeout                          = false                               {product}
     intx SafepointTimeoutDelay                     = 10000                               {product}
     bool ScavengeBeforeFullGC                      = true                                {product}
     intx SelfDestructTimer                         = 0                                   {product}
    uintx SharedBaseAddress                         = 0                                   {product}
    ccstr SharedClassListFile                       =                                     {product}
    uintx SharedMiscCodeSize                        = 122880                              {product}
    uintx SharedMiscDataSize                        = 4194304                             {product}
    uintx SharedReadOnlySize                        = 16777216                            {product}
    uintx SharedReadWriteSize                       = 16777216                            {product}
     bool ShowMessageBoxOnError                     = false                               {product}
     intx SoftRefLRUPolicyMSPerMB                   = 1000                                {product}
     bool SpecialEncodeISOArray                     = true                                {C2 product}
     bool SplitIfBlocks                             = true                                {C2 product}
     intx StackRedPages                             = 1                                   {pd product}
     intx StackShadowPages                          = 6                                   {pd product}
     bool StackTraceInThrowable                     = true                                {product}
     intx StackYellowPages                          = 3                                   {pd product}
     bool StartAttachListener                       = false                               {product}
     intx StarvationMonitorInterval                 = 200                                 {product}
     bool StressLdcRewrite                          = false                               {product}
    uintx StringDeduplicationAgeThreshold           = 3                                   {product}
    uintx StringTableSize                           = 60013                               {product}
     bool SuppressFatalErrorMessage                 = false                               {product}
    uintx SurvivorPadding                           = 3                                   {product}
    uintx SurvivorRatio                             = 8                                   {product}
     intx SuspendRetryCount                         = 50                                  {product}
     intx SuspendRetryDelay                         = 5                                   {product}
     intx SyncFlags                                 = 0                                   {product}
    ccstr SyncKnobs                                 =                                     {product}
     intx SyncVerbose                               = 0                                   {product}
    uintx TLABAllocationWeight                      = 35                                  {product}
    uintx TLABRefillWasteFraction                   = 64                                  {product}
    uintx TLABSize                                  = 0                                   {product}
     bool TLABStats                                 = true                                {product}
    uintx TLABWasteIncrement                        = 4                                   {product}
    uintx TLABWasteTargetPercent                    = 1                                   {product}
    uintx TargetPLABWastePct                        = 10                                  {product}
    uintx TargetSurvivorRatio                       = 50                                  {product}
    uintx TenuredGenerationSizeIncrement            = 20                                  {product}
    uintx TenuredGenerationSizeSupplement           = 80                                  {product}
    uintx TenuredGenerationSizeSupplementDecay      = 2                                   {product}
     intx ThreadPriorityPolicy                      = 0                                   {product}
     bool ThreadPriorityVerbose                     = false                               {product}
    uintx ThreadSafetyMargin                        = 52428800                            {product}
     intx ThreadStackSize                           = 0                                   {pd product}
    uintx ThresholdTolerance                        = 10                                  {product}
     intx Tier0BackedgeNotifyFreqLog                = 10                                  {product}
     intx Tier0InvokeNotifyFreqLog                  = 7                                   {product}
     intx Tier0ProfilingStartPercentage             = 200                                 {product}
     intx Tier23InlineeNotifyFreqLog                = 20                                  {product}
     intx Tier2BackEdgeThreshold                    = 0                                   {product}
     intx Tier2BackedgeNotifyFreqLog                = 14                                  {product}
     intx Tier2CompileThreshold                     = 0                                   {product}
     intx Tier2InvokeNotifyFreqLog                  = 11                                  {product}
     intx Tier3BackEdgeThreshold                    = 60000                               {product}
     intx Tier3BackedgeNotifyFreqLog                = 13                                  {product}
     intx Tier3CompileThreshold                     = 2000                                {product}
     intx Tier3DelayOff                             = 2                                   {product}
     intx Tier3DelayOn                              = 5                                   {product}
     intx Tier3InvocationThreshold                  = 200                                 {product}
     intx Tier3InvokeNotifyFreqLog                  = 10                                  {product}
     intx Tier3LoadFeedback                         = 5                                   {product}
     intx Tier3MinInvocationThreshold               = 100                                 {product}
     intx Tier4BackEdgeThreshold                    = 40000                               {product}
     intx Tier4CompileThreshold                     = 15000                               {product}
     intx Tier4InvocationThreshold                  = 5000                                {product}
     intx Tier4LoadFeedback                         = 3                                   {product}
     intx Tier4MinInvocationThreshold               = 600                                 {product}
     bool TieredCompilation                         = true                                {pd product}
     intx TieredCompileTaskTimeout                  = 50                                  {product}
     intx TieredRateUpdateMaxTime                   = 25                                  {product}
     intx TieredRateUpdateMinTime                   = 1                                   {product}
     intx TieredStopAtLevel                         = 4                                   {product}
     bool TimeLinearScan                            = false                               {C1 product}
     bool TraceBiasedLocking                        = false                               {product}
     bool TraceClassLoading                         = false                               {product rw}
     bool TraceClassLoadingPreorder                 = false                               {product}
     bool TraceClassPaths                           = false                               {product}
     bool TraceClassResolution                      = false                               {product}
     bool TraceClassUnloading                       = false                               {product rw}
     bool TraceDynamicGCThreads                     = false                               {product}
     bool TraceGen0Time                             = false                               {product}
     bool TraceGen1Time                             = false                               {product}
    ccstr TraceJVMTI                                =                                     {product}
     bool TraceLoaderConstraints                    = false                               {product rw}
     bool TraceMetadataHumongousAllocation          = false                               {product}
     bool TraceMonitorInflation                     = false                               {product}
     bool TraceParallelOldGCTasks                   = false                               {product}
     intx TraceRedefineClasses                      = 0                                   {product}
     bool TraceSafepointCleanupTime                 = false                               {product}
     bool TraceSharedLookupCache                    = false                               {product}
     bool TraceSuspendWaitFailures                  = false                               {product}
     intx TrackedInitializationLimit                = 50                                  {C2 product}
     bool TransmitErrorReport                       = false                               {product}
     bool TrapBasedNullChecks                       = false                               {pd product}
     bool TrapBasedRangeChecks                      = false                               {C2 pd product}
     intx TypeProfileArgsLimit                      = 2                                   {product}
    uintx TypeProfileLevel                          = 111                                 {pd product}
     intx TypeProfileMajorReceiverPercent           = 90                                  {C2 product}
     intx TypeProfileParmsLimit                     = 2                                   {product}
     intx TypeProfileWidth                          = 2                                   {product}
     intx UnguardOnExecutionViolation               = 0                                   {product}
     bool UnlinkSymbolsALot                         = false                               {product}
     bool Use486InstrsOnly                          = false                               {ARCH product}
     bool UseAES                                    = true                                {product}
     bool UseAESIntrinsics                          = true                                {product}
     intx UseAVX                                    = 2                                   {ARCH product}
     bool UseAdaptiveGCBoundary                     = false                               {product}
     bool UseAdaptiveGenerationSizePolicyAtMajorCollection  = true                                {product}
     bool UseAdaptiveGenerationSizePolicyAtMinorCollection  = true                                {product}
     bool UseAdaptiveNUMAChunkSizing                = true                                {product}
     bool UseAdaptiveSizeDecayMajorGCCost           = true                                {product}
     bool UseAdaptiveSizePolicy                     = true                                {product}
     bool UseAdaptiveSizePolicyFootprintGoal        = true                                {product}
     bool UseAdaptiveSizePolicyWithSystemGC         = false                               {product}
     bool UseAddressNop                             = true                                {ARCH product}
     bool UseAltSigs                                = false                               {product}
     bool UseAutoGCSelectPolicy                     = false                               {product}
     bool UseBMI1Instructions                       = true                                {ARCH product}
     bool UseBMI2Instructions                       = true                                {ARCH product}
     bool UseBiasedLocking                          = true                                {product}
     bool UseBimorphicInlining                      = true                                {C2 product}
     bool UseBoundThreads                           = true                                {product}
     bool UseCLMUL                                  = true                                {ARCH product}
     bool UseCMSBestFit                             = true                                {product}
     bool UseCMSCollectionPassing                   = true                                {product}
     bool UseCMSCompactAtFullCollection             = true                                {product}
     bool UseCMSInitiatingOccupancyOnly             = false                               {product}
     bool UseCRC32Intrinsics                        = true                                {product}
     bool UseCodeCacheFlushing                      = true                                {product}
     bool UseCompiler                               = true                                {product}
     bool UseCompilerSafepoints                     = true                                {product}
     bool UseCompressedClassPointers               := true                                {lp64_product}
     bool UseCompressedOops                        := true                                {lp64_product}
     bool UseConcMarkSweepGC                        = false                               {product}
     bool UseCondCardMark                           = false                               {C2 product}
     bool UseCountLeadingZerosInstruction           = true                                {ARCH product}
     bool UseCountTrailingZerosInstruction          = true                                {ARCH product}
     bool UseCountedLoopSafepoints                  = false                               {C2 product}
     bool UseCounterDecay                           = true                                {product}
     bool UseDivMod                                 = true                                {C2 product}
     bool UseDynamicNumberOfGCThreads               = false                               {product}
     bool UseFPUForSpilling                         = true                                {C2 product}
     bool UseFastAccessorMethods                    = false                               {product}
     bool UseFastEmptyMethods                       = false                               {product}
     bool UseFastJNIAccessors                       = true                                {product}
     bool UseFastStosb                              = true                                {ARCH product}
     bool UseG1GC                                   = false                               {product}
     bool UseGCLogFileRotation                      = false                               {product}
     bool UseGCOverheadLimit                        = true                                {product}
     bool UseGCTaskAffinity                         = false                               {product}
     bool UseGHASHIntrinsics                        = true                                {product}
     bool UseHeavyMonitors                          = false                               {product}
     bool UseInlineCaches                           = true                                {product}
     bool UseInterpreter                            = true                                {product}
     bool UseJumpTables                             = true                                {C2 product}
     bool UseLWPSynchronization                     = true                                {product}
     bool UseLargePages                             = false                               {pd product}
     bool UseLargePagesInMetaspace                  = false                               {product}
     bool UseLargePagesIndividualAllocation        := false                               {pd product}
     bool UseLockedTracing                          = false                               {product}
     bool UseLoopCounter                            = true                                {product}
     bool UseLoopInvariantCodeMotion                = true                                {C1 product}
     bool UseLoopPredicate                          = true                                {C2 product}
     bool UseMathExactIntrinsics                    = true                                {C2 product}
     bool UseMaximumCompactionOnSystemGC            = true                                {product}
     bool UseMembar                                 = false                               {pd product}
     bool UseMontgomeryMultiplyIntrinsic            = true                                {C2 product}
     bool UseMontgomerySquareIntrinsic              = true                                {C2 product}
     bool UseMulAddIntrinsic                        = true                                {C2 product}
     bool UseMultiplyToLenIntrinsic                 = true                                {C2 product}
     bool UseNUMA                                   = false                               {product}
     bool UseNUMAInterleaving                       = false                               {product}
     bool UseNewLongLShift                          = false                               {ARCH product}
     bool UseOSErrorReporting                       = false                               {pd product}
     bool UseOldInlining                            = true                                {C2 product}
     bool UseOnStackReplacement                     = true                                {pd product}
     bool UseOnlyInlinedBimorphic                   = true                                {C2 product}
     bool UseOptoBiasInlining                       = true                                {C2 product}
     bool UsePSAdaptiveSurvivorSizePolicy           = true                                {product}
     bool UseParNewGC                               = false                               {product}
     bool UseParallelGC                            := true                                {product}
     bool UseParallelOldGC                          = true                                {product}
     bool UsePerfData                               = true                                {product}
     bool UsePopCountInstruction                    = true                                {product}
     bool UseRDPCForConstantTableBase               = false                               {C2 product}
     bool UseRTMDeopt                               = false                               {ARCH product}
     bool UseRTMLocking                             = false                               {ARCH product}
     bool UseSHA                                    = false                               {product}
     bool UseSHA1Intrinsics                         = false                               {product}
     bool UseSHA256Intrinsics                       = false                               {product}
     bool UseSHA512Intrinsics                       = false                               {product}
     intx UseSSE                                    = 4                                   {product}
     bool UseSSE42Intrinsics                        = true                                {product}
     bool UseSerialGC                               = false                               {product}
     bool UseSharedSpaces                           = false                               {product}
     bool UseSignalChaining                         = true                                {product}
     bool UseSquareToLenIntrinsic                   = true                                {C2 product}
     bool UseStoreImmI16                            = false                               {ARCH product}
     bool UseStringDeduplication                    = false                               {product}
     bool UseSuperWord                              = true                                {C2 product}
     bool UseTLAB                                   = true                                {pd product}
     bool UseThreadPriorities                       = true                                {pd product}
     bool UseTypeProfile                            = true                                {product}
     bool UseTypeSpeculation                        = true                                {C2 product}
     bool UseUTCFileTimestamp                       = true                                {product}
     bool UseUnalignedLoadStores                    = true                                {ARCH product}
     bool UseVMInterruptibleIO                      = false                               {product}
     bool UseXMMForArrayCopy                        = true                                {product}
     bool UseXmmI2D                                 = false                               {ARCH product}
     bool UseXmmI2F                                 = false                               {ARCH product}
     bool UseXmmLoadAndClearUpper                   = true                                {ARCH product}
     bool UseXmmRegToRegMoveAll                     = true                                {ARCH product}
     bool VMThreadHintNoPreempt                     = false                               {product}
     intx VMThreadPriority                          = -1                                  {product}
     intx VMThreadStackSize                         = 0                                   {pd product}
     intx ValueMapInitialSize                       = 11                                  {C1 product}
     intx ValueMapMaxLoopSize                       = 8                                   {C1 product}
     intx ValueSearchLimit                          = 1000                                {C2 product}
     bool VerifyMergedCPBytecodes                   = true                                {product}
     bool VerifySharedSpaces                        = false                               {product}
     intx WorkAroundNPTLTimedWaitHang               = 1                                   {product}
    uintx YoungGenerationSizeIncrement              = 20                                  {product}
    uintx YoungGenerationSizeSupplement             = 80                                  {product}
    uintx YoungGenerationSizeSupplementDecay        = 8                                   {product}
    uintx YoungPLABSize                             = 4096                                {product}
     bool ZeroTLAB                                  = false                               {product}
     intx hashCode                                  = 5                                   {product}
用法: java [-options] class [args...]
           (执行类)
   或  java [-options] -jar jarfile [args...]
           (执行 jar 文件)
其中选项包括:
    -d32          使用 32 位数据模型 (如果可用)
    -d64          使用 64 位数据模型 (如果可用)
    -server       选择 "server" VM
                  默认 VM 是 server.


    -cp <目录和 zip/jar 文件的类搜索路径>
    -classpath <目录和 zip/jar 文件的类搜索路径>
                  用 ; 分隔的目录, JAR 档案
                  和 ZIP 档案列表, 用于搜索类文件。
    -D<名称>=<值>
                  设置系统属性
    -verbose:[class|gc|jni]
                  启用详细输出
    -version      输出产品版本并退出
    -version:<值>
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  需要指定的版本才能运行
    -showversion  输出产品版本并继续
    -jre-restrict-search | -no-jre-restrict-search
                  警告: 此功能已过时, 将在
                  未来发行版中删除。
                  在版本搜索中包括/排除用户专用 JRE
    -? -help      输出此帮助消息
    -X            输出非标准选项的帮助
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  按指定的粒度启用断言
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  禁用具有指定粒度的断言
    -esa | -enablesystemassertions
                  启用系统断言
    -dsa | -disablesystemassertions
                  禁用系统断言
    -agentlib:<libname>[=<选项>]
                  加载本机代理库 <libname>, 例如 -agentlib:hprof
                  另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help
    -agentpath:<pathname>[=<选项>]
                  按完整路径名加载本机代理库
    -javaagent:<jarpath>[=<选项>]
                  加载 Java 编程语言代理, 请参阅 java.lang.instrument
    -splash:<imagepath>
                  使用指定的图像显示启动屏幕
有关详细信息, 请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。

PS C:\WINDOWS\system32>

其中:=表示被修改后的最终值,=表示没有被修改的最终值(也就是初始值),例如

intx CICompilerCount                          := 4                                   {product}
bool CICompilerCountPerCPU                     = true                                {product}

参数最后的标记为{manageable}的才能被jinfo动态修改并生效,比如:

     bool PrintClassHistogram                       = false                               {manageable}
     bool PrintClassHistogramAfterFullGC            = false                               {manageable}
     bool PrintClassHistogramBeforeFullGC           = false                               {manageable}

-XX:+PrintCommandLineFlags

查看通过命令行修改的JVM参数名和参数值

jmap:导出内存映像文件&内存使用情况

导出内存映像文件:-dump

如果使用-dump:live,就只导出当前存活的对象;可以加上-F来强制执行。

堆快照文件包括:触发快照时所有的类、所有的对象、GC根对象、线程栈和局部变量,触发时会触发一次Full GC

手动方式

导出所有的对象:

PS C:\WINDOWS\system32>  jmap -dump:format=b,file=C:\Users\songzeceng\Desktop\out1.dump 21352
Dumping heap to C:\Users\songzeceng\Desktop\out1.dump ...
Heap dump file created

只导出存活的对象:

PS C:\WINDOWS\system32>  jmap -dump:format=b,file=C:\Users\songzeceng\Desktop\out4.dump,live 12172
Dumping heap to C:\Users\songzeceng\Desktop\out4.dump ...
Heap dump file created

自动方式

在程序OOM时自动导出堆映射文件,需要在java程序运行时指定两个JVM参数:-XX:+HeapDumpOnOutOfMemoryError(开启OOM时自动导出堆映射文件)和-XX:HeapDumpPath=path/to/file.dump(堆映射保存的位置)

测试代码:

// -Xmx60m -Xms60m -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:/Users/songzeceng/Desktop/oom.dump
public class GCTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            byte[] arr = new byte[1024 * 100];
            list.add(arr);
            try {
                Thread.sleep(120);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

显示内存相关信息

-heap

PS C:\WINDOWS\system32> jmap -heap 9804
Attaching to process ID 9804, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11

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

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 62914560 (60.0MB)
   NewSize                  = 20971520 (20.0MB)
   MaxNewSize               = 20971520 (20.0MB)
   OldSize                  = 41943040 (40.0MB)
   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 = 16777216 (16.0MB)
   used     = 2988232 (2.8498001098632812MB)
   free     = 13788984 (13.150199890136719MB)
   17.811250686645508% used
From Space:
   capacity = 2097152 (2.0MB)
   used     = 2064640 (1.968994140625MB)
   free     = 32512 (0.031005859375MB)
   98.44970703125% used
To Space:
   capacity = 2097152 (2.0MB)
   used     = 0 (0.0MB)
   free     = 2097152 (2.0MB)
   0.0% used
PS Old Generation
   capacity = 41943040 (40.0MB)
   used     = 13502496 (12.876983642578125MB)
   free     = 28440544 (27.123016357421875MB)
   32.19245910644531% used

1742 interned Strings occupying 156520 bytes.

PS C:\WINDOWS\system32>

包括调用此命令时的堆配置信息和堆占用信息

-histo

PS C:\WINDOWS\system32> jmap -histo 9804 
num     #instances         #bytes  class name
----------------------------------------------
   1:           306       28301728  [B
   2:          2425         330776  [C
   3:           157         294208  [I
   4:           591          67840  java.lang.Class
   5:          2276          54624  java.lang.String
   6:           587          36736  [Ljava.lang.Object;
   7:           791          31640  java.util.TreeMap$Entry
   8:           201           8336  [Ljava.lang.String;
   9:           113           8136  java.lang.reflect.Field
  10:            73           4672  java.net.URL
  11:           105           4200  java.lang.ref.SoftReference
  12:           256           4096  java.lang.Integer
  13:           118           3776  java.util.Hashtable$Entry
  14:             8           3008  java.lang.Thread
  15:            90           2880  java.util.concurrent.ConcurrentHashMap$Node
  16:            70           2240  java.util.HashMap$Node
  17:            36           2016  sun.misc.URLClassPath$JarLoader
  18:            38           1824  sun.util.locale.LocaleObjectCache$CacheEntry
  19:            22           1760  java.lang.reflect.Constructor
  20:            16           1664  [Ljava.util.HashMap$Node;
  21:            41           1640  java.lang.ref.Finalizer
  22:            38           1520  java.util.LinkedHashMap$Entry
  23:            37           1480  java.io.ObjectStreamField
  24:            86           1376  java.lang.Object
  25:            24           1344  java.lang.Class$ReflectionData
  26:            15           1200  [Ljava.util.WeakHashMap$Entry;
  27:             2           1064  [Ljava.lang.invoke.MethodHandle;
  28:             7           1056  [Ljava.util.Hashtable$Entry;
  29:            22           1056  java.util.HashMap
  30:             1           1040  [Ljava.lang.Integer;
  31:             1           1040  [[C
  32:             5            912  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  33:            38            912  java.io.ExpiringCache$Entry
  34:            15            840  sun.nio.cs.UTF_8$Encoder
  35:            12            768  java.util.jar.JarFile
  36:            19            760  sun.util.locale.BaseLocale$Key
  37:            15            720  java.util.WeakHashMap
  38:             7            672  java.util.jar.JarFile$JarFileEntry
  39:            12            672  java.util.zip.ZipFile$ZipFileInputStream
  40:            11            648  [Ljava.lang.reflect.Field;
  41:             8            640  [S
  42:            19            608  java.lang.ref.ReferenceQueue
  43:            19            608  java.util.Locale
  44:            19            608  sun.util.locale.BaseLocale
  45:            13            520  java.security.AccessControlContext
  46:            21            504  java.util.jar.Attributes$Name
  47:            19            456  java.util.Locale$LocaleKey
  48:            13            416  java.io.File
  49:            13            392  [Ljava.io.ObjectStreamField;
  50:             1            384  com.intellij.rt.execution.application.AppMainV2$1
  51:             1            384  java.lang.ref.Finalizer$FinalizerThread
  52:             6            384  java.nio.DirectByteBuffer
  53:             6            384  java.util.concurrent.ConcurrentHashMap
  54:            12            384  java.util.zip.ZipCoder
  55:             1            376  java.lang.ref.Reference$ReferenceHandler
  56:             9            360  sun.nio.cs.UTF_8$Decoder
  57:            21            336  java.lang.ref.ReferenceQueue$Lock
  58:             6            336  java.nio.DirectLongBufferU
  59:             8            320  java.io.FileDescriptor
  60:            10            320  java.lang.OutOfMemoryError
  61:             3            312  [D
  62:            12            288  java.util.ArrayDeque
  63:            12            288  sun.misc.MetaIndex
  64:            11            264  [Ljava.lang.reflect.Constructor;
  65:             3            264  java.lang.reflect.Method
  66:            11            264  sun.reflect.NativeConstructorAccessorImpl
  67:            14            240  [Ljava.lang.Class;
  68:             6            240  java.util.WeakHashMap$Entry
  69:             9            216  java.util.ArrayList
  70:             4            192  java.util.Hashtable
  71:             4            192  java.util.TreeMap
  72:             6            192  java.util.Vector
  73:            11            176  sun.reflect.DelegatingConstructorAccessorImpl
  74:             2            160  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
  75:             4            160  java.lang.ClassLoader$NativeLibrary
  76:             4            160  java.security.ProtectionDomain
  77:             3            144  java.nio.HeapByteBuffer
  78:             6            144  java.util.LinkedList$Node
  79:             3            144  java.util.Properties
  80:             6            144  sun.misc.PerfCounter
  81:             2            128  java.io.ExpiringCache$1
  82:             4            128  java.io.FileInputStream
  83:             4            128  java.lang.ThreadLocal$ThreadLocalMap$Entry
  84:             4            128  java.security.CodeSource
  85:             4            128  java.util.LinkedList
  86:             1            120  java.net.SocksSocketImpl
  87:             5            120  sun.misc.FloatingDecimal$PreparedASCIIToBinaryBuffer
  88:             2            112  java.util.LinkedHashMap
  89:             2            112  java.util.zip.ZipFile$ZipFileInflaterInputStream
  90:             3             96  java.io.FileOutputStream
  91:             4             96  java.lang.RuntimePermission
  92:             2             96  java.lang.ThreadGroup
  93:             3             96  java.util.Stack
  94:             2             96  java.util.zip.Inflater
  95:             1             96  sun.misc.Launcher$AppClassLoader
  96:             2             96  sun.misc.URLClassPath
  97:             3             96  sun.net.spi.DefaultProxySelector$NonProxyInfo
  98:             2             96  sun.nio.cs.StreamEncoder
  99:             1             88  java.net.DualStackPlainSocketImpl
100:             1             88  sun.misc.Launcher$ExtClassLoader
101:             2             80  java.io.BufferedWriter
102:             2             80  java.io.ExpiringCache
103:             5             80  java.lang.ThreadLocal
104:             2             80  sun.misc.FloatingDecimal$BinaryToASCIIBuffer
105:             3             72  java.net.Proxy$Type
106:             3             72  java.util.concurrent.atomic.AtomicLong
107:             3             72  sun.misc.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
108:             1             64  [F
109:             2             64  [Ljava.lang.Thread;
110:             4             64  [Ljava.security.Principal;
111:             2             64  java.io.FilePermission
112:             2             64  java.io.PrintStream
113:             2             64  java.lang.ClassValue$Entry
114:             2             64  java.lang.StringCoding$StringEncoder
115:             2             64  java.lang.VirtualMachineError
116:             2             64  java.lang.ref.ReferenceQueue$Null
117:             2             64  java.security.BasicPermissionCollection
118:             2             64  java.security.Permissions
119:             4             64  java.security.ProtectionDomain$Key
120:             1             64  sun.nio.cs.ext.DoubleByte$Encoder
121:             1             56  java.lang.Package
122:             1             56  sun.nio.cs.ext.DoubleByte$Decoder
123:             1             48  [J
124:             2             48  [Ljava.lang.reflect.Method;
125:             2             48  java.io.BufferedOutputStream
126:             1             48  java.io.BufferedReader
127:             2             48  java.io.File$PathStatus
128:             2             48  java.io.FilePermissionCollection
129:             2             48  java.io.OutputStreamWriter
130:             2             48  java.lang.ThreadLocal$ThreadLocalMap
131:             2             48  java.net.InetAddress$Cache
132:             2             48  java.net.InetAddress$Cache$Type
133:             1             48  java.net.SocketInputStream
134:             1             48  java.nio.HeapCharBuffer
135:             2             48  java.nio.charset.CoderResult
136:             3             48  java.nio.charset.CodingErrorAction
137:             2             48  java.util.zip.ZStreamRef
138:             2             48  sun.misc.NativeSignalHandler
139:             2             48  sun.misc.Signal
140:             1             48  sun.nio.cs.StreamDecoder
141:             1             48  sun.nio.cs.US_ASCII$Decoder
142:             1             40  [[Ljava.lang.String;
143:             1             40  java.io.BufferedInputStream
144:             1             40  sun.nio.cs.StandardCharsets$Aliases
145:             1             40  sun.nio.cs.StandardCharsets$Cache
146:             1             40  sun.nio.cs.StandardCharsets$Classes
147:             1             40  sun.nio.cs.ext.ExtendedCharsets
148:             1             32  [Ljava.lang.OutOfMemoryError;
149:             2             32  [Ljava.lang.StackTraceElement;
150:             1             32  [Ljava.lang.ThreadGroup;
151:             1             32  [Ljava.net.Proxy$Type;
152:             1             32  java.io.WinNTFileSystem
153:             1             32  java.lang.ArithmeticException
154:             2             32  java.lang.Boolean
155:             1             32  java.lang.NullPointerException
156:             1             32  java.lang.StringCoding$StringDecoder
157:             1             32  java.lang.ref.WeakReference
158:             1             32  java.net.InetAddress$InetAddressHolder
159:             1             32  java.net.Socket
160:             2             32  java.nio.ByteOrder
161:             2             32  java.util.concurrent.atomic.AtomicInteger
162:             1             32  java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
163:             1             32  sun.instrument.InstrumentationImpl
164:             2             32  sun.net.www.protocol.jar.Handler
165:             1             32  sun.nio.cs.StandardCharsets
166:             1             24  [Ljava.io.File$PathStatus;
167:             1             24  [Ljava.lang.ClassValue$Entry;
168:             1             24  [Ljava.net.InetAddress$Cache$Type;
169:             1             24  [Ljava.security.ProtectionDomain;
170:             1             24  [Lsun.launcher.LauncherHelper;
171:             1             24  java.io.InputStreamReader
172:             1             24  java.lang.ClassValue$Version
173:             1             24  java.lang.StringBuilder
174:             1             24  java.lang.invoke.MethodHandleImpl$4
175:             1             24  java.lang.reflect.ReflectPermission
176:             1             24  java.net.Inet4Address
177:             1             24  java.net.Inet6AddressImpl
178:             1             24  java.net.Proxy
179:             1             24  java.util.BitSet
180:             1             24  java.util.Collections$EmptyMap
181:             1             24  java.util.Collections$SetFromMap
182:             1             24  java.util.Collections$SynchronizedSet
183:             1             24  java.util.Collections$UnmodifiableRandomAccessList
184:             1             24  java.util.Locale$Cache
185:             1             24  java.util.jar.Manifest
186:             1             24  sun.instrument.TransformerManager
187:             1             24  sun.launcher.LauncherHelper
188:             1             24  sun.misc.JarIndex
189:             1             24  sun.misc.URLClassPath$FileLoader
190:             1             24  sun.nio.cs.ISO_8859_1
191:             1             24  sun.nio.cs.ThreadLocalCoders$1
192:             1             24  sun.nio.cs.ThreadLocalCoders$2
193:             1             24  sun.nio.cs.US_ASCII
194:             1             24  sun.nio.cs.UTF_16
195:             1             24  sun.nio.cs.UTF_16BE
196:             1             24  sun.nio.cs.UTF_16LE
197:             1             24  sun.nio.cs.UTF_8
198:             1             24  sun.nio.cs.ext.GBK
199:             1             24  sun.reflect.NativeMethodAccessorImpl
200:             1             24  sun.util.locale.BaseLocale$Cache
201:             1             16  [Ljava.lang.Throwable;
202:             1             16  [Ljava.security.cert.Certificate;
203:             1             16  [Lsun.instrument.TransformerManager$TransformerInfo;
204:             1             16  java.io.FileDescriptor$1
205:             1             16  java.lang.CharacterDataLatin1
206:             1             16  java.lang.ClassValue$Identity
207:             1             16  java.lang.Runtime
208:             1             16  java.lang.String$CaseInsensitiveComparator
209:             1             16  java.lang.System$2
210:             1             16  java.lang.Terminator$1
211:             1             16  java.lang.invoke.MemberName$Factory
212:             1             16  java.lang.invoke.MethodHandleImpl$2
213:             1             16  java.lang.invoke.MethodHandleImpl$3
214:             1             16  java.lang.ref.Reference$1
215:             1             16  java.lang.ref.Reference$Lock
216:             1             16  java.lang.reflect.ReflectAccess
217:             1             16  java.net.InetAddress$2
218:             1             16  java.net.URLClassLoader$7
219:             1             16  java.nio.Bits$1
220:             1             16  java.nio.charset.CoderResult$1
221:             1             16  java.nio.charset.CoderResult$2
222:             1             16  java.security.ProtectionDomain$2
223:             1             16  java.security.ProtectionDomain$JavaSecurityAccessImpl
224:             1             16  java.util.Collections$EmptyList
225:             1             16  java.util.Collections$EmptySet
226:             1             16  java.util.Hashtable$EntrySet
227:             1             16  java.util.WeakHashMap$KeySet
228:             1             16  java.util.concurrent.atomic.AtomicBoolean
229:             1             16  java.util.jar.Attributes
230:             1             16  java.util.jar.JavaUtilJarAccessImpl
231:             1             16  java.util.zip.ZipFile$1
232:             1             16  sun.misc.ASCIICaseInsensitiveComparator
233:             1             16  sun.misc.FloatingDecimal$1
234:             1             16  sun.misc.Launcher
235:             1             16  sun.misc.Launcher$Factory
236:             1             16  sun.misc.Perf
237:             1             16  sun.misc.Unsafe
238:             1             16  sun.net.spi.DefaultProxySelector
239:             1             16  sun.net.www.protocol.file.Handler
240:             1             16  sun.reflect.DelegatingMethodAccessorImpl
241:             1             16  sun.reflect.ReflectionFactory
Total          9286       29206632

PS C:\WINDOWS\system32>

包括调用时刻的类对象数量、对象占用空间字节数和对应的全类名

小结

由于jmap要访问堆中的所有对象,为了保证此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变堆中数据的状态。因此jmap导出的堆快照必定是在安全点位置的,而如果某些对象的生命周期在两个安全点之间,那么这些对象将无法被:live选项探知;而且,如果某个线程长时间无法跑到安全点,jmap将会一直等下去。

jstat则与之不同,GC会主动把jstat所需要的数据保存到固定位置,jstat只需要读取即可

jhat:jdk自带分析工具

主要用来分析jmap生成的堆映射文件,它会开启一个http服务,默认地址为http://localhost:7000/,但是jhat在jdk9和10中被删除了,改用为VisualVM

PS C:\Users\songzeceng\Desktop> jhat .\out1.dump
Reading from .\out1.dump...
Dump file created Wed Feb 03 20:00:36 CST 2021
Snapshot read, resolving...
Resolving 9155 objects...
Chasing references, expect 1 dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

然后通过浏览器访问localhost:7000:

我们看一下Show heap histogram:

结果和jmap -histo的一样

我们再进入Execute Object Query Language (OQL) query做一些查询:

点击其中一个就可以看到具体信息:

 jstack:打印JVM中的线程快照

可以用来生成某JVM进程中所有线程的快照,需要留意死锁(Deadlock)、等待资源(Waiting on condition)、等待获取监视器(Waiting on monitor entry)、阻塞(Blocked)这几个状态

死锁

测试代码:

public class ThreadDeadLock {
    public static void main(String[] args) {
        StringBuilder builder1 = new StringBuilder();
        StringBuilder builder2 = new StringBuilder();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (builder1) {
                    builder1.append(1);
                    builder2.append("a");

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (builder2) {
                        builder1.append(2);
                        builder2.append("b");
                    }
                }
            }
        }).start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (builder2) {
                    builder1.append(1);
                    builder2.append("a");
                    
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (builder1) {
                        builder1.append(2);
                        builder2.append("b");
                    }
                }
            }
        }).start();
    }
}

此程序基本一运行就死锁,然后使用jstack测试:

PS C:\Users\songzeceng\Desktop> jps
17472
20992 Jps
21364 ThreadDeadLock
15052 Launcher

PS C:\Users\songzeceng\Desktop> jstack 21364
2021-02-03 20:56:53
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):

"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000002993800 nid=0xf78 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001de97800 nid=0xe38 waiting for monitor entry [0x000000001fbef000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.ThreadDeadLock$2.run(ThreadDeadLock.java:43)
        - waiting to lock <0x000000076bad9310> (a java.lang.StringBuilder)
        - locked <0x000000076bad9358> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001de96000 nid=0x4840 waiting for monitor entry [0x000000001faee000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.ThreadDeadLock$1.run(ThreadDeadLock.java:22)
        - waiting to lock <0x000000076bad9358> (a java.lang.StringBuilder)
        - locked <0x000000076bad9310> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001de74000 nid=0x4c60 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001ddda800 nid=0x6ec waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001ddd7800 nid=0xe78 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001ddd7000 nid=0x5148 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001ddd2000 nid=0x3710 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001ddd1800 nid=0x5048 runnable [0x000000001f3ef000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:47)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001dd33000 nid=0x3238 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001dd32000 nid=0x1ae8 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000002a8d800 nid=0x4e7c in Object.wait() [0x000000001f08f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001dd13000 nid=0x16a0 in Object.wait() [0x000000001ef8e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=2 tid=0x000000001dcf2800 nid=0x4a1c runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000029aa000 nid=0x2c04 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000029ab800 nid=0x3e60 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000029ad000 nid=0xf94 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000000029af800 nid=0x3e10 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000000029b2000 nid=0x4cd8 runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000000029b3000 nid=0x1214 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00000000029b6800 nid=0xc4c runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00000000029b7800 nid=0x4a14 runnable

"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x00000000029b8800 nid=0x1eec runnable

"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x00000000029ba000 nid=0x5218 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001de92800 nid=0x221c waiting on condition

JNI global references: 12

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001c6565a8 (object 0x000000076bad9310, a java.lang.StringBuilder),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001c655108 (object 0x000000076bad9358, a java.lang.StringBuilder),
  which is held by "Thread-1"


Java stack information for the threads listed above:
===================================================
"Thread-1":
        at test.ThreadDeadLock$2.run(ThreadDeadLock.java:43)
        - waiting to lock <0x000000076bad9310> (a java.lang.StringBuilder)
        - locked <0x000000076bad9358> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at test.ThreadDeadLock$1.run(ThreadDeadLock.java:22)
        - waiting to lock <0x000000076bad9358> (a java.lang.StringBuilder)
        - locked <0x000000076bad9310> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

PS C:\Users\songzeceng\Desktop> 

最后的信息可以看到jstack发现Thread-1和Thread-0发生了死锁,而且都在等待锁,且持有锁

测试等待资源

测试代码:

public class ThreadSleepTest {
    public static void main(String[] args) {
        System.out.println("begin");
        try {
            Thread.sleep(10 * 1000 * 60);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

运行后进行检测:

PS C:\Users\songzeceng\Desktop> jps
17472
9296 Jps
20676 Launcher
12568 ThreadSleepTest

PS C:\Users\songzeceng\Desktop> jstack 12568
2021-02-03 21:01:12
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001e72e800 nid=0x2030 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001e68d000 nid=0x1508 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001e68a000 nid=0xc9c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001e689800 nid=0x2f8c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001e684800 nid=0xc0c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001e678800 nid=0x2d34 runnable [0x000000001fc9e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:47)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001e624000 nid=0x53a8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001e623000 nid=0x3ce8 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001e604800 nid=0x4f08 in Object.wait() [0x000000001f93f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001cf1e800 nid=0x38e4 in Object.wait() [0x000000001f83f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=0 tid=0x0000000003263800 nid=0x2c2c waiting on condition [0x000000000308f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at test.ThreadSleepTest.main(ThreadSleepTest.java:7)

"VM Thread" os_prio=2 tid=0x000000001e5c2800 nid=0x31d8 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x000000000327a000 nid=0x49d0 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000327b800 nid=0x3348 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000327d000 nid=0x2fbc runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000327f800 nid=0x28ec runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000003282000 nid=0x634 runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003283000 nid=0x4068 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000003286800 nid=0x900 runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000003287800 nid=0x4d58 runnable

"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x0000000003288800 nid=0x4a48 runnable

"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x000000000328a000 nid=0x5060 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001e74d000 nid=0x7fc waiting on condition

JNI global references: 12

PS C:\Users\songzeceng\Desktop>

直接找主线程,可以发现如下信息:

"main" #1 prio=5 os_prio=0 tid=0x0000000003263800 nid=0x2c2c waiting on condition [0x000000000308f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at test.ThreadSleepTest.main(ThreadSleepTest.java:7)

说明正在休眠,等待时间

同步测试

测试代码:

public class ThreadSyncTest {
    public static void main(String[] args) {
        NumThread n = new NumThread();
        Thread t1 = new Thread(n);
        Thread t2 = new Thread(n);

        t1.start();
        t2.start();
    }
}

class NumThread implements Runnable {
    private int num = 0;

    @Override
    public void run() {
       while (true) {
           synchronized (this) {
               if (num < 100) {
                   try {
                       Thread.sleep(500);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + " got number: "+ num);
                   num++;
               } else {
                   break;
               }
           }
       }
    }
}

运行后,进行监控:

PS C:\Users\songzeceng\Desktop> jps
17472
13640 ThreadSyncTest
13612 Launcher
20092 Jps

PS C:\Users\songzeceng\Desktop> jstack 13640
2021-02-03 21:08:54
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):

"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x00000000035a3800 nid=0x464c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001eab3000 nid=0x49c4 waiting on condition [0x000000002079f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at test.NumThread.run(ThreadSyncTest.java:23)
        - locked <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001eab1800 nid=0x3c0c waiting for monitor entry [0x000000002069e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.NumThread.run(ThreadSyncTest.java:21)
        - waiting to lock <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001ea8f800 nid=0x2a8c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001e9f9800 nid=0x400c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001e9f7000 nid=0x3bf4 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001e9f6000 nid=0x3c64 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001e9e9800 nid=0x38c8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001e9e3000 nid=0xe34 runnable [0x000000001ff9e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:47)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001e9a9800 nid=0x46d8 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001d26e000 nid=0x5228 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001d263000 nid=0x152c in Object.wait() [0x000000001fc9f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001e933000 nid=0x38dc in Object.wait() [0x000000001fb9e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=2 tid=0x000000001e912800 nid=0x4f34 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000035ba000 nid=0x3530 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000035bb800 nid=0x3c34 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000035bd000 nid=0x290c runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00000000035bf800 nid=0x4778 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000000035c2000 nid=0x1ca8 runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000000035c3000 nid=0x42ec runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00000000035c6800 nid=0x5134 runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00000000035c7800 nid=0x3110 runnable

"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x00000000035c8800 nid=0x3d00 runnable

"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x00000000035ca000 nid=0xf90 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001eaae000 nid=0x2f4 waiting on condition

JNI global references: 12

PS C:\Users\songzeceng\Desktop>

找到Thread-1和Thread-0的相关信息:

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001eab3000 nid=0x49c4 waiting on condition [0x000000002079f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at test.NumThread.run(ThreadSyncTest.java:23)
        - locked <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001eab1800 nid=0x3c0c waiting for monitor entry [0x000000002069e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.NumThread.run(ThreadSyncTest.java:21)
        - waiting to lock <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

可见,Thread-1正在休眠500ms,所以是等待条件状态;而Thread-0一直拿不到this的同步锁拥有权,所以是且一直是waiting for monitor entry状态

-l参数

此参数可以显示锁的相关信息:

PS C:\Users\songzeceng\Desktop> jps
17472
8164 ThreadSyncTest
16620 Launcher
9932 Jps

PS C:\Users\songzeceng\Desktop> jstack -l 8164
2021-02-03 21:12:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):

"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000002ae3800 nid=0x40c0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001dfde800 nid=0x4a48 waiting on condition [0x000000001fcce000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at test.NumThread.run(ThreadSyncTest.java:23)
        - locked <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001dfdc800 nid=0x2708 waiting for monitor entry [0x000000001fbcf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.NumThread.run(ThreadSyncTest.java:21)
        - waiting to lock <0x000000076badb820> (a test.NumThread)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - None

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001dfc2000 nid=0x3238 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001df28800 nid=0x3d0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001df25800 nid=0xd6c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001df25000 nid=0x33fc waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001df20000 nid=0x4980 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001df15800 nid=0x3314 runnable [0x000000001f4ce000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:47)

   Locked ownable synchronizers:
        - None

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001ded6000 nid=0x4e7c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001de7e800 nid=0x297c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001c7a2000 nid=0x3518 in Object.wait() [0x000000001f1ce000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000002bde000 nid=0x4068 in Object.wait() [0x000000001f0cf000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

   Locked ownable synchronizers:
        - None

"VM Thread" os_prio=2 tid=0x000000001de42800 nid=0x5258 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002afa000 nid=0x38d8 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002afb800 nid=0x51b8 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002afd000 nid=0x534 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002aff800 nid=0x3108 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000002b02000 nid=0x2d4c runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000002b03000 nid=0x2760 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000002b06800 nid=0x1154 runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000002b07800 nid=0x38e4 runnable

"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x0000000002b08800 nid=0x3af0 runnable

"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x0000000002b0a000 nid=0x260 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001dfd9800 nid=0x1b8 waiting on condition

JNI global references: 12

PS C:\Users\songzeceng\Desktop>

会多出一些Locked ownable synchronizers信息,目前都是None

jcmd:多功能命令行

jcmd可以用来实现前面除了jstat之外的所有命令的功能,包括导出堆内存文件、查看java进程、检测java线程信息、执行GC、JVM运行时间、查看堆内存文件等,它拥有jmap的大部分功能,故被Oracle官方推荐使用

查看JVM的进程号和主类的全类名:

查看可执行命令:jcmd pid help

PS C:\Users\songzeceng\Desktop> jcmd
17472
21584 sun.tools.jcmd.JCmd
21844 org.jetbrains.jps.cmdline.Launcher D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/idea_rt.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/netty-common-4.1.52.Final.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/maven-builder-support-3.6.1.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/intellij-deps-fastutil-8.4.1-4.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/annotations.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/util.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/plugins/java/lib/maven-resolver-transport-http-1.3.3.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/platform-api.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/commons-logging-1.2.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/netty-transport-4.1.52.Final.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/httpclient-4.5.12.jar;D:/develop/IntelliJ IDEA Community Edition 2019.1.3/lib/gson-2.8.6.jar;D:/develop/IntelliJ
21864 test.ThreadDeadLock

PS C:\Users\songzeceng\Desktop> jcmd 21864 help
21864:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
VM.classloader_stats
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.finalizer_info
GC.heap_info
GC.run_finalization
GC.run
VM.uptime
VM.dynlibs
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help <command>'.

PS C:\Users\songzeceng\Desktop>

查看线程信息:jcmd pid Thread.print

PS C:\Users\songzeceng\Desktop> jcmd 21864 Thread.print
21864:
2021-02-03 21:25:32
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):

"DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x0000000003283800 nid=0x55f0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001e7b2000 nid=0x56a8 waiting for monitor entry [0x000000002046e000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.ThreadDeadLock$2.run(ThreadDeadLock.java:43)
        - waiting to lock <0x000000076bad9310> (a java.lang.StringBuilder)
        - locked <0x000000076bad9358> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

"Thread-0" #12 prio=5 os_prio=0 tid=0x000000001e7b0000 nid=0x56a4 waiting for monitor entry [0x000000002036f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at test.ThreadDeadLock$1.run(ThreadDeadLock.java:22)
        - waiting to lock <0x000000076bad9358> (a java.lang.StringBuilder)
        - locked <0x000000076bad9310> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001e77d800 nid=0x569c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001e6e0000 nid=0x5698 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001e6dd000 nid=0x5694 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001e6dc800 nid=0x5690 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001e6d7800 nid=0x568c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001e6cd800 nid=0x5688 runnable [0x000000001fc6e000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
        at java.net.SocketInputStream.read(SocketInputStream.java:171)
        at java.net.SocketInputStream.read(SocketInputStream.java:141)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x000000076b884a90> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:47)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001e689800 nid=0x5680 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001cf4e000 nid=0x567c runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001cf43000 nid=0x5658 in Object.wait() [0x000000001f96f000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
        - locked <0x000000076b708ed8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001e613000 nid=0x5654 in Object.wait() [0x000000001f86e000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076b706c00> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=2 tid=0x000000001e5f2800 nid=0x5650 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x000000000329a000 nid=0x561c runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000329b800 nid=0x5620 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000329d000 nid=0x5624 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000329f800 nid=0x5628 runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00000000032a2000 nid=0x562c runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00000000032a3000 nid=0x5630 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00000000032a6800 nid=0x5634 runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00000000032a7800 nid=0x5638 runnable

"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x00000000032a8800 nid=0x563c runnable

"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x00000000032aa000 nid=0x5640 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001e7a4800 nid=0x56a0 waiting on condition

JNI global references: 12

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x000000001cf426e8 (object 0x000000076bad9310, a java.lang.StringBuilder),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000001cf41248 (object 0x000000076bad9358, a java.lang.StringBuilder),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at test.ThreadDeadLock$2.run(ThreadDeadLock.java:43)
        - waiting to lock <0x000000076bad9310> (a java.lang.StringBuilder)
        - locked <0x000000076bad9358> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)
"Thread-0":
        at test.ThreadDeadLock$1.run(ThreadDeadLock.java:22)
        - waiting to lock <0x000000076bad9358> (a java.lang.StringBuilder)
        - locked <0x000000076bad9310> (a java.lang.StringBuilder)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

PS C:\Users\songzeceng\Desktop>

查看堆信息直方图:jcmd pid GC.class_histogram

PS C:\Users\songzeceng\Desktop> jcmd 21864 GC.class_histogram
21864:


num     #instances         #bytes  class name
----------------------------------------------
   1:          2438         331672  [C
   2:           594          68160  java.lang.Class
   3:          2287          54888  java.lang.String
   4:            29          34888  [B
   5:           585          33608  [Ljava.lang.Object;
   6:           791          31640  java.util.TreeMap$Entry
   7:           200           8320  [Ljava.lang.String;
   8:           113           8136  java.lang.reflect.Field
   9:            73           4672  java.net.URL
  10:           105           4176  [I
  11:           103           4120  java.lang.ref.SoftReference
  12:           256           4096  java.lang.Integer
  13:           118           3776  java.util.Hashtable$Entry
  14:            10           3760  java.lang.Thread
  15:            96           3072  java.util.concurrent.ConcurrentHashMap$Node
  16:            71           2272  java.util.HashMap$Node
  17:            36           2016  sun.misc.URLClassPath$JarLoader
  18:            38           1824  sun.util.locale.LocaleObjectCache$CacheEntry
  19:            22           1760  java.lang.reflect.Constructor
  20:            43           1720  java.lang.ref.Finalizer
  21:            16           1664  [Ljava.util.HashMap$Node;
  22:            96           1536  java.lang.Object
  23:            38           1520  java.util.LinkedHashMap$Entry
  24:            37           1480  java.io.ObjectStreamField
  25:            24           1344  java.lang.Class$ReflectionData
  26:            15           1200  [Ljava.util.WeakHashMap$Entry;
  27:             2           1064  [Ljava.lang.invoke.MethodHandle;
  28:             7           1056  [Ljava.util.Hashtable$Entry;
  29:            22           1056  java.util.HashMap
  30:             1           1040  [Ljava.lang.Integer;
  31:             1           1040  [[C
  32:             5            912  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  33:            38            912  java.io.ExpiringCache$Entry
  34:            14            784  sun.nio.cs.UTF_8$Encoder
  35:            12            768  java.util.jar.JarFile
  36:            19            760  sun.util.locale.BaseLocale$Key
  37:            15            720  java.util.WeakHashMap
  38:             7            672  java.util.jar.JarFile$JarFileEntry
  39:            12            672  java.util.zip.ZipFile$ZipFileInputStream
  40:            11            648  [Ljava.lang.reflect.Field;
  41:             8            640  [S
  42:            19            608  java.lang.ref.ReferenceQueue
  43:            19            608  java.util.Locale
  44:            19            608  sun.util.locale.BaseLocale
  45:            15            600  java.security.AccessControlContext
  46:            21            504  java.util.jar.Attributes$Name
  47:            19            456  java.util.Locale$LocaleKey
  48:            13            416  java.io.File
  49:            10            400  java.io.FileDescriptor
  50:            13            392  [Ljava.io.ObjectStreamField;
  51:             1            384  com.intellij.rt.execution.application.AppMainV2$1
  52:             1            384  java.lang.ref.Finalizer$FinalizerThread
  53:             6            384  java.nio.DirectByteBuffer
  54:             6            384  java.util.concurrent.ConcurrentHashMap
  55:            12            384  java.util.zip.ZipCoder
  56:             1            376  java.lang.ref.Reference$ReferenceHandler
  57:            21            336  java.lang.ref.ReferenceQueue$Lock
  58:             6            336  java.nio.DirectLongBufferU
  59:            10            320  java.lang.OutOfMemoryError
  60:             8            320  sun.nio.cs.UTF_8$Decoder
  61:             3            312  [D
  62:            12            288  java.util.ArrayDeque
  63:            12            288  sun.misc.MetaIndex
  64:            11            264  [Ljava.lang.reflect.Constructor;
  65:             3            264  java.lang.reflect.Method
  66:            11            264  sun.reflect.NativeConstructorAccessorImpl
  67:            14            240  [Ljava.lang.Class;
  68:             6            240  java.util.WeakHashMap$Entry
  69:             6            192  java.io.FileInputStream
  70:             8            192  java.util.ArrayList
  71:             4            192  java.util.Hashtable
  72:             4            192  java.util.TreeMap
  73:             6            192  java.util.Vector
  74:            11            176  sun.reflect.DelegatingConstructorAccessorImpl
  75:             4            160  java.lang.ClassLoader$NativeLibrary
  76:             4            160  java.security.ProtectionDomain
  77:             3            144  java.nio.HeapByteBuffer
  78:             6            144  java.util.LinkedList$Node
  79:             3            144  java.util.Properties
  80:             6            144  sun.misc.PerfCounter
  81:             2            128  java.io.ExpiringCache$1
  82:             4            128  java.security.CodeSource
  83:             4            128  java.util.LinkedList
  84:             1            120  java.net.SocksSocketImpl
  85:             5            120  sun.misc.FloatingDecimal$PreparedASCIIToBinaryBuffer
  86:             2            112  java.lang.Package
  87:             2            112  java.util.LinkedHashMap
  88:             2            112  java.util.zip.ZipFile$ZipFileInflaterInputStream
  89:             3             96  java.io.FileOutputStream
  90:             4             96  java.lang.RuntimePermission
  91:             2             96  java.lang.ThreadGroup
  92:             3             96  java.util.Stack
  93:             2             96  java.util.zip.Inflater
  94:             1             96  sun.misc.Launcher$AppClassLoader
  95:             2             96  sun.misc.URLClassPath
  96:             3             96  sun.net.spi.DefaultProxySelector$NonProxyInfo
  97:             2             96  sun.nio.cs.StreamEncoder
  98:             1             88  java.net.DualStackPlainSocketImpl
  99:             1             88  sun.misc.Launcher$ExtClassLoader
100:             1             80  [Ljava.lang.ThreadLocal$ThreadLocalMap$Entry;
101:             2             80  java.io.BufferedWriter
102:             2             80  java.io.ExpiringCache
103:             5             80  java.lang.ThreadLocal
104:             2             80  sun.misc.FloatingDecimal$BinaryToASCIIBuffer
105:             3             72  [Ljava.security.ProtectionDomain;
106:             3             72  java.lang.StringBuilder
107:             3             72  java.net.Proxy$Type
108:             3             72  java.util.concurrent.atomic.AtomicLong
109:             3             72  sun.misc.FloatingDecimal$ExceptionalBinaryToASCIIBuffer
110:             1             64  [F
111:             2             64  [Ljava.lang.Thread;
112:             4             64  [Ljava.security.Principal;
113:             2             64  java.io.FilePermission
114:             2             64  java.io.PrintStream
115:             2             64  java.lang.ClassValue$Entry
116:             2             64  java.lang.VirtualMachineError
117:             2             64  java.lang.ref.ReferenceQueue$Null
118:             2             64  java.security.BasicPermissionCollection
119:             2             64  java.security.Permissions
120:             4             64  java.security.ProtectionDomain$Key
121:             1             64  sun.nio.cs.ext.DoubleByte$Encoder
122:             1             48  [J
123:             2             48  [Ljava.lang.reflect.Method;
124:             2             48  java.io.BufferedOutputStream
125:             1             48  java.io.BufferedReader
126:             2             48  java.io.File$PathStatus
127:             2             48  java.io.FilePermissionCollection
128:             2             48  java.io.OutputStreamWriter
129:             2             48  java.net.InetAddress$Cache
130:             2             48  java.net.InetAddress$Cache$Type
131:             1             48  java.net.SocketInputStream
132:             1             48  java.nio.HeapCharBuffer
133:             2             48  java.nio.charset.CoderResult
134:             3             48  java.nio.charset.CodingErrorAction
135:             2             48  java.util.zip.ZStreamRef
136:             2             48  sun.misc.NativeSignalHandler
137:             2             48  sun.misc.Signal
138:             1             48  sun.nio.cs.StreamDecoder
139:             1             48  sun.nio.cs.US_ASCII$Decoder
140:             1             40  [[Ljava.lang.String;
141:             1             40  java.io.BufferedInputStream
142:             1             40  sun.nio.cs.StandardCharsets$Aliases
143:             1             40  sun.nio.cs.StandardCharsets$Cache
144:             1             40  sun.nio.cs.StandardCharsets$Classes
145:             1             40  sun.nio.cs.ext.ExtendedCharsets
146:             1             32  [Ljava.lang.OutOfMemoryError;
147:             2             32  [Ljava.lang.StackTraceElement;
148:             1             32  [Ljava.lang.ThreadGroup;
149:             1             32  [Ljava.net.Proxy$Type;
150:             1             32  java.io.WinNTFileSystem
151:             1             32  java.lang.ArithmeticException
152:             2             32  java.lang.Boolean
153:             1             32  java.lang.NullPointerException
154:             1             32  java.lang.StringCoding$StringEncoder
155:             1             32  java.lang.ThreadLocal$ThreadLocalMap$Entry
156:             1             32  java.lang.ref.WeakReference
157:             1             32  java.net.InetAddress$InetAddressHolder
158:             1             32  java.net.Socket
159:             2             32  java.nio.ByteOrder
160:             2             32  java.util.concurrent.atomic.AtomicInteger
161:             1             32  java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
162:             1             32  sun.instrument.InstrumentationImpl
163:             2             32  sun.net.www.protocol.jar.Handler
164:             1             32  sun.nio.cs.StandardCharsets
165:             1             24  [Ljava.io.File$PathStatus;
166:             1             24  [Ljava.lang.ClassValue$Entry;
167:             1             24  [Ljava.net.InetAddress$Cache$Type;
168:             1             24  [Lsun.launcher.LauncherHelper;
169:             1             24  java.io.InputStreamReader
170:             1             24  java.lang.ClassValue$Version
171:             1             24  java.lang.ThreadLocal$ThreadLocalMap
172:             1             24  java.lang.invoke.MethodHandleImpl$4
173:             1             24  java.lang.reflect.ReflectPermission
174:             1             24  java.net.Inet4Address
175:             1             24  java.net.Inet6AddressImpl
176:             1             24  java.net.Proxy
177:             1             24  java.util.BitSet
178:             1             24  java.util.Collections$EmptyMap
179:             1             24  java.util.Collections$SetFromMap
180:             1             24  java.util.Collections$SynchronizedSet
181:             1             24  java.util.Collections$UnmodifiableRandomAccessList
182:             1             24  java.util.Locale$Cache
183:             1             24  java.util.jar.Manifest
184:             1             24  sun.instrument.TransformerManager
185:             1             24  sun.launcher.LauncherHelper
186:             1             24  sun.misc.JarIndex
187:             1             24  sun.misc.URLClassPath$FileLoader
188:             1             24  sun.nio.cs.ISO_8859_1
189:             1             24  sun.nio.cs.ThreadLocalCoders$1
190:             1             24  sun.nio.cs.ThreadLocalCoders$2
191:             1             24  sun.nio.cs.US_ASCII
192:             1             24  sun.nio.cs.UTF_16
193:             1             24  sun.nio.cs.UTF_16BE
194:             1             24  sun.nio.cs.UTF_16LE
195:             1             24  sun.nio.cs.UTF_8
196:             1             24  sun.nio.cs.ext.GBK
197:             1             24  sun.reflect.NativeMethodAccessorImpl
198:             1             24  sun.util.locale.BaseLocale$Cache
199:             1             24  test.ThreadDeadLock$1
200:             1             24  test.ThreadDeadLock$2
201:             1             16  [Ljava.lang.Throwable;
202:             1             16  [Ljava.security.cert.Certificate;
203:             1             16  [Lsun.instrument.TransformerManager$TransformerInfo;
204:             1             16  java.io.FileDescriptor$1
205:             1             16  java.lang.CharacterDataLatin1
206:             1             16  java.lang.ClassValue$Identity
207:             1             16  java.lang.Runtime
208:             1             16  java.lang.String$CaseInsensitiveComparator
209:             1             16  java.lang.System$2
210:             1             16  java.lang.Terminator$1
211:             1             16  java.lang.invoke.MemberName$Factory
212:             1             16  java.lang.invoke.MethodHandleImpl$2
213:             1             16  java.lang.invoke.MethodHandleImpl$3
214:             1             16  java.lang.ref.Reference$1
215:             1             16  java.lang.ref.Reference$Lock
216:             1             16  java.lang.reflect.ReflectAccess
217:             1             16  java.net.InetAddress$2
218:             1             16  java.net.URLClassLoader$7
219:             1             16  java.nio.Bits$1
220:             1             16  java.nio.charset.CoderResult$1
221:             1             16  java.nio.charset.CoderResult$2
222:             1             16  java.security.ProtectionDomain$2
223:             1             16  java.security.ProtectionDomain$JavaSecurityAccessImpl
224:             1             16  java.util.Collections$EmptyList
225:             1             16  java.util.Collections$EmptySet
226:             1             16  java.util.Hashtable$EntrySet
227:             1             16  java.util.WeakHashMap$KeySet
228:             1             16  java.util.concurrent.atomic.AtomicBoolean
229:             1             16  java.util.jar.Attributes
230:             1             16  java.util.jar.JavaUtilJarAccessImpl
231:             1             16  java.util.zip.ZipFile$1
232:             1             16  sun.misc.ASCIICaseInsensitiveComparator
233:             1             16  sun.misc.FloatingDecimal$1
234:             1             16  sun.misc.Launcher
235:             1             16  sun.misc.Launcher$Factory
236:             1             16  sun.misc.Perf
237:             1             16  sun.misc.Unsafe
238:             1             16  sun.net.spi.DefaultProxySelector
239:             1             16  sun.net.www.protocol.file.Handler
240:             1             16  sun.reflect.DelegatingMethodAccessorImpl
241:             1             16  sun.reflect.ReflectionFactory
Total          9002         649216

PS C:\Users\songzeceng\Desktop>

导出堆映射文件:jcmd pid GC.heap_dump file_path

PS C:\Users\songzeceng\Desktop> jcmd 21864 GC.heap_dump C:\Users\songzeceng\Desktop\jcmd.dump
21864:
Heap dump file created

其他

强制执行一次GC

PS C:\Users\songzeceng\Desktop> jcmd 21864 GC.run
21864:
Command executed successfully

查看进程运行时间

PS C:\Users\songzeceng\Desktop> jcmd 21864 VM.uptime
21864:
519.584 s

查看系统属性

PS C:\Users\songzeceng\Desktop> jcmd 21864 VM.system_properties
21864:
#Wed Feb 03 21:33:35 CST 2021
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=D\:\\develop\\jdk1.8.0_231_x64\\jre\\bin
java.vm.version=25.231-b11
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=D\:\\develop\\ideaWorkspace\\JVMDemo
java.runtime.version=1.8.0_231-b11
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\endorsed
os.arch=amd64
java.io.tmpdir=C\:\\WINDOWS\\TEMP\\
line.separator=\r\n
java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Windows 10
sun.jnu.encoding=GBK
java.library.path=D\:\\develop\\jdk1.8.0_231_x64\\bin;C\:\\WINDOWS\\Sun\\Java\\bin;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.2\\bin;C\:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.2\\libnvvp;C\:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0\\bin;C\:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0\\libnvvp;C\:\\ProgramData\\Oracle\\Java\\javapath;D\:\\develop\\xftp6\\;D\:\\develop\\Xshell6\\;D\:\\develop\\Python\\Python37\\Scripts\\;D\:\\develop\\Python\\Python37\\;C\:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C\:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\iCLS\\;C\:\\Program Files\\Intel\\Intel(R) Management Engine Components\\iCLS\\;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Windows\\System32\\OpenSSH\\;C\:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C\:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C\:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C\:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C\:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C\:\\Program Files\\Intel\\WiFi\\bin\\;C\:\\Program Files\\Common Files\\Intel\\WirelessCommon\\;D\:\\develop\\scala-2.11.12\\bin;C\:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;D\:\\develop\\nodejs\\;D\:\\develop\\LLVM\\bin;C\:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\WINDOWS\\System32\\OpenSSH\\;D\:\\develop\\Go\\bin;D\:\\develop\\Subversion\\bin;C\:\\Program Files\\NVIDIA Corporation\\Nsight Compute 2019.5.0\\;D\:\\develop\\Miniconda3;D\:\\develop\\Miniconda3\\Scripts;C\:\\Program Files\\MySQL\\MySQL Server 5.7\\bin;D\:\\develop\\Git\\bin;D\:\\develop\\maven\\apache-maven-3.6.1\\bin;D\:\\develop\\scala-2.11.12\\bin;D\:\\develop\\Graphviz2.38\\bin;D\:\\develop\\neo4j-community-3.3.1-windows\\neo4j-community-3.3.1\\bin;D\:\\develop\\flutter\\flutter\\bin;C\:\\Users\\songzeceng\\AppData\\Roaming\\npm;D\:\\develop\\Android\\sdk\\platform-tools;D\:\\develop\\mingw-w64\\mingw64\\bin;D\:\\develop\\LLVM\\bin;C\:\\Users\\songzeceng\\AppData\\Local\\Microsoft\\WindowsApps;D\:\\develop\\gzip-1.3.12-1-bin\\bin;D\:\\develop\\MinGW\\bin;D\:\\develop\\Miniconda3\\Lib\\site-packages\\torch\\lib;C\:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\x86_amd64;D\:\\develop\\lua-5.3.5;D\:\\develop\\flink-1.7.2\\bin;D\:\\develop\\jdk1.8.0_231_x64\\bin;D\:\\develop\\groovy-2.4.18\\bin;C\:\\Users\\songzeceng\\go\\bin;D\:\\develop\\Microsoft VS Code\\bin;D\:\\develop\\PyCharm 2020.2.2\\bin;;D\:\\develop\\CLion 2020.2.4\\bin;;C\:\\Windows\\System32\\;;.
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=10.0
user.home=C\:\\Users\\songzeceng
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.class.path=D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\charsets.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\deploy.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\access-bridge-64.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\cldrdata.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\dnsns.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\jaccess.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\jfxrt.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\localedata.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\nashorn.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\sunec.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\sunjce_provider.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\sunmscapi.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\sunpkcs11.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext\\zipfs.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\javaws.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jce.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jfr.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jfxswt.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jsse.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\management-agent.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\plugin.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\resources.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\rt.jar;D\:\\develop\\ideaWorkspace\\JVMDemo\\target\\classes;D\:\\develop\\IntelliJ IDEA Community Edition 2019.1.3\\lib\\idea_rt.jar
user.name=songzeceng
java.vm.specification.version=1.8
sun.java.command=test.ThreadDeadLock
java.home=D\:\\develop\\jdk1.8.0_231_x64\\jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_231
java.ext.dirs=D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\ext;C\:\\WINDOWS\\Sun\\Java\\lib\\ext
sun.boot.class.path=D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\resources.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\rt.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\sunrsasign.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jsse.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jce.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\charsets.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\lib\\jfr.jar;D\:\\develop\\jdk1.8.0_231_x64\\jre\\classes
java.vendor=Oracle Corporation
file.separator=\\
java.vendor.url.bug=http\://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.desktop=windows
sun.cpu.isalist=amd64

获取JVM参数

PS C:\Users\songzeceng\Desktop> jcmd 21864 VM.flags
21864:
-XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:MaxHeapSize=4257218560 -XX:MaxNewSize=1418723328 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

jstatd:远程主机信息收集

了解一下就行,jstatd是一个RMI服务端程序,相当于一个代理服务器,建立本地计算机和远程监控工具的通信,它将本机的java应用程序信息传递到远程计算机,以供上面的命令行工具的远程使用(在相应的命令行工具后面指定ip:端口即可)

结语

下一篇文章介绍一些常用的gui检测工具

猜你喜欢

转载自blog.csdn.net/qq_37475168/article/details/115047864