目录
查看堆信息直方图:jcmd pid GC.class_histogram
导出堆映射文件:jcmd pid GC.heap_dump file_path
背景
此文介绍常用的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检测工具