jps
命令用于查询正在运行的JVM进程
命令格式
options参数解释:
-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数
jps
>jps
10856 Launcher
14840 Jps
15016 KotlinCompileDaemon
12368 ThisMonitor
13260 JConsole
13324 Launcher
5756
jps -l
>jps -l
1856 jdk.jcmd/sun.tools.jps.Jps
10856 org.jetbrains.jps.cmdline.Launcher
15016 org.jetbrains.kotlin.daemon.KotlinCompileDaemon
12368 com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor
13260 jdk.jconsole/sun.tools.jconsole.JConsole
13324 org.jetbrains.jps.cmdline.Launcher
5756
jinfo
用于查询当前运行这的JVM属性和参数的值
options参数解释:
-flag 打印指定名称的参数
-flag [+|-] 打开或关闭参数
-flag = 设置参数
-flags 打印所有参数
-sysprops 打印系统配置
jinfo -flags 12368
> jinfo -flags 12368
VM Flags:
-XX:CICompilerCount=4 -XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:G1HeapRegionSize=1048576 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=266338304 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=
4255121408 -XX:MaxNewSize=2552233984 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5836300 -XX:NonProfiledCodeHeapSize=122910970 -XX:ProfiledCodeHeapSize=122910970 -XX:ReservedCodeCacheSize=251
658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
jinfo -sysprops 12368
> jinfo -sysprops 12368
Java System Properties:
sun.desktop=windows
awt.toolkit=sun.awt.windows.WToolkit
java.specification.version=11
sun.cpu.isalist=amd64
sun.jnu.encoding=GBK
java.class.path=D\:\\workspace\\thread-exercise\\target\\classes
java.vm.vendor=Amazon.com Inc.
sun.arch.data.model=64
user.variant=
java.vendor.url=https\://aws.amazon.com/corretto/
user.timezone=Asia/Shanghai
java.vm.specification.version=11
os.name=Windows 10
sun.java.launcher=SUN_STANDARD
user.country=CN
sun.boot.library.path=D\:\\DevelopTools\\jdk\\jdk11.0.9_11\\bin
sun.java.command=com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor
jdk.debug=release
sun.cpu.endian=little
user.home=C\:\\Users\\Andy
user.language=zh
java.specification.vendor=Oracle Corporation
java.version.date=2020-10-20
java.home=D\:\\DevelopTools\\jdk\\jdk11.0.9_11
file.separator=\\
java.vm.compressedOopsMode=Zero based
line.separator=\r\n
java.specification.name=Java Platform API Specification
java.vm.specification.vendor=Oracle Corporation
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
user.script=
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
java.runtime.version=11.0.9+11-LTS
user.name=James
path.separator=;
os.version=10.0
java.runtime.name=OpenJDK Runtime Environment
file.encoding=UTF-8
java.vm.name=OpenJDK 64-Bit Server VM
java.version=11.0.9
user.dir=D\:\\workspace\\thread-exercise
os.arch=amd64
java.vm.specification.name=Java Virtual Machine Specification
java.awt.printerjob=sun.awt.windows.WPrinterJob
sun.os.patch.level=
java.library.path=
java.vm.info=mixed mode
java.vendor=Amazon.com Inc.
java.vm.version=11.0.9+11-LTS
sun.io.unicode.encoding=UnicodeLittle
java.class.version=55.0
jstat
可以实时显示本地或远程JVM进程中类装载、内存、垃圾收集、JIT编译等数据
-
jstat -class 12368 3000 3 类加载统计
>jstat -class 12368 3000 3
Loaded Bytes Unloaded Bytes Time
934 2162.8 0 0.0 0.06
934 2162.8 0 0.0 0.06
934 2162.8 0 0.0 0.06
Loaded 加载类的数量
Bytes 加载类合计大小
Unloaded 卸载类的数量
Bytes 卸载类合计大小
Time 表示加载和卸载类总共的耗时
jstat -compiler 12368 3000 3 编译统计
>jstat -compiler 12368 3000 3
Compiled Failed Invalid Time FailedType FailedMethod
216 0 0 0.06 0
216 0 0 0.06 0
216 0 0 0.06 0
Compiled 表示编译任务执行的次数
Failed 表示编译失败的次数
Invalid 表示编译不可用的次数
Time 表示编译的总耗时
FailedType 表示最后一次编译的类型
FailedMethod 表示最后一次编译失败的类名和方法名
jstat -gc 12368 3000 3 垃圾回收统计
>jstat -gc 12368
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCT
0.0 0.0 0.0 0.0 26624.0 4096.0 233472.0 0.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 0 0.000 0.000
0.0 0.0 0.0 0.0 26624.0 4096.0 233472.0 0.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 0 0.000 0.000
0.0 0.0 0.0 0.0 26624.0 4096.0 233472.0 0.0 0.0 0.0 0.0 0.0 0 0.000 0 0.000 0 0.000 0.000
字段解释:
S0C survivor0大小
S1C survivor1大小
S0U survivor0已使用大小
S1U survivor1已使用大小
EC Eden区大小
EU Eden区已使用大小
OC 老年代大小
OU 老年代已使用大小
MC 方法区大小
MU 方法区已使用大小
CCSC 压缩类空间大小
CCSU 压缩类空间已使用大小
YGC 年轻代垃圾回收次数
YGCT 年轻代垃圾回收消耗时间
FGC 老年代垃圾回收次数
FGCT 老年代垃圾回收消耗时间
GCT 垃圾回收消耗总时间
jstat -gccapacity 12368 3000 3 堆内存统计
>jstat -gccapacity 12368 3000 3
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC CGC
0.0 4155392.0 26624.0 0.0 0.0 26624.0 0.0 4155392.0 233472.0 233472.0 0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0
0.0 4155392.0 26624.0 0.0 0.0 26624.0 0.0 4155392.0 233472.0 233472.0 0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0
0.0 4155392.0 26624.0 0.0 0.0 26624.0 0.0 4155392.0 233472.0 233472.0 0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0
NGCMN:新生代最小值(KB)
NGVMX:新生代最大值(KB)
NGC:当前新生代大小(KB)
S0C:同上
S1C:同上
EC:同上
OGCMN:老年代最小值(KB)
OGCMX:老年代最大值(KB)
OGC:当前老年代大小(KB)
OC:同上
MCMN :方法区最小值(KB)
MCMX :方法区最大值(KB)
MCC :当前方法区大小(KB)
CCSMN : 压缩类空间最大值
CCSMX : 压缩类空间最小值
CCSC :当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
jstat -gccause 12368 3000 3 显示垃圾回收的相关信息
>jstat -gccause 12368 3000 3
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT LGCC GCC
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000 No GC No GC
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000 No GC No GC
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000 No GC No GC
LGCC:上一次GC的原因,是G1垃圾回收器回收
GCC :当前GC的原因
jstat -gcnew 12368 3000 3 显示新生代的详细信息
>jstat -gcnew 12368 3000 3
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
0.0 0.0 0.0 0.0 15 15 0.0 26624.0 4096.0 0 0.000
0.0 0.0 0.0 0.0 15 15 0.0 26624.0 4096.0 0 0.000
0.0 0.0 0.0 0.0 15 15 0.0 26624.0 4096.0 0 0.000
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
jstat -gcnewcapacity 12368 3000 3 新生代各个区的详细信息
>jstat -gcnewcapacity 12368 3000 3
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC CGC
0.0 4155392.0 26624.0 0.0 0.0 4155392.0 0.0 4155392.0 26624.0 0 0 0
0.0 4155392.0 26624.0 0.0 0.0 4155392.0 0.0 4155392.0 26624.0 0 0 0
0.0 4155392.0 26624.0 0.0 0.0 4155392.0 0.0 4155392.0 26624.0 0 0 0
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
jstat -gcold 12368 3000 3 老年代垃圾回收统计
>jstat -gcold 12368 3000 3
MC MU CCSC CCSU OC OU YGC FGC FGCT CGC CGCT GCT
0.0 0.0 0.0 0.0 233472.0 0.0 0 0 0.000 0 0.000 0.000
0.0 0.0 0.0 0.0 233472.0 0.0 0 0 0.000 0 0.000 0.000
0.0 0.0 0.0 0.0 233472.0 0.0 0 0 0.000 0 0.000 0.000
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
jstat -gcoldcapacity 12368 3000 3 老年代各个区的详细信息
> jstat -gcoldcapacity 12368 3000 3
OGCMN OGCMX OGC OC YGC FGC FGCT CGC CGCT GCT
0.0 4155392.0 233472.0 233472.0 0 0 0.000 0 0.000 0.000
0.0 4155392.0 233472.0 233472.0 0 0 0.000 0 0.000 0.000
0.0 4155392.0 233472.0 233472.0 0 0 0.000 0 0.000 0.000
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
jstat -gcmetacapacity 12368 3000 3 元数据空间统计
>jstat -gcmetacapacity 12368 3000 3
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT CGC CGCT GCT
0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0.000 0 0.000 0.000
0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0.000 0 0.000 0.000
0.0 1056768.0 0.0 0.0 1048576.0 0.0 0 0 0.000 0 0.000 0.000
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
jstat -gcutil 12368 3000 3 总体垃圾回收统计
>jstat -gcutil 12368 3000 3
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000
0.00 0.00 15.38 0.00 - - 0 0.000 0 0.000 0 0.000 0.000
S0 survivor0使用百分比
S1 survivor1使用百分比
E Eden区使用百分比
O 老年代使用百分比
M 元数据区使用百分比
CCS 压缩使用百分比
YGC 年轻代垃圾回收次数
YGCT 年轻代垃圾回收消耗时间
FGC 老年代垃圾回收次数
FGCT 老年代垃圾回收消耗时间
GCT 垃圾回收消耗总时间
jstat -printcompilation 12368 3000 3 编译方法统计
>jstat -printcompilation 12368 3000 3
Compiled Size Type Method
221 382 1 java/util/HashMap putVal
221 382 1 java/util/HashMap putVal
221 382 1 java/util/HashMap putVal
Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识。
jstack
通过jstack可以观察到jvm中当前所有线程的运行情况和线程当前状态,可以用来分析线程问题(如死锁)。
想要通过jstack命令来分析线程的情况的话,首先要知道线程都有哪些状态, 如果有不清楚的可以参考下面连接: 多线程——线程的生命周期.
jstack [ option ] pid
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
D:\workspace\thread-exercise>jstack 12368
Full thread dump OpenJDK 64-Bit Server VM (11.0.9+11-LTS mixed mode):
Threads class SMR info:
_java_thread_list=0x000002052fc3c090, length=14, elements={
0x000002052fa3e800, 0x000002052fa47800, 0x000002052fab4000, 0x000002052fab5000,
0x000002052fab7000, 0x000002052fabe000, 0x000002052fabf800, 0x000002052fa00800,
0x000002052fd57000, 0x000002052fdd2800, 0x000002052fde4000, 0x000002052fdec000,
0x000002052fddd800, 0x000002052fddf000
}
"Reference Handler" #2 daemon prio=10 os_prio=2 cpu=0.00ms elapsed=917.24s tid=0x000002052fa3e800 nid=0x2a9c waiting on condition [0x000000bd0ecff000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method)
at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:213)
"Finalizer" #3 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=917.24s tid=0x000002052fa47800 nid=0x2f88 in Object.wait() [0x000000bd0edfe000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait([email protected]/Native Method)
- waiting on <0x0000000712308f18> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x0000000712308f18> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run([email protected]/Finalizer.java:170)
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=917.22s tid=0x000002052fab4000 nid=0x138 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #5 daemon prio=5 os_prio=2 cpu=15.63ms elapsed=917.22s tid=0x000002052fab5000 nid=0x47c0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 cpu=31.25ms elapsed=917.22s tid=0x000002052fab7000 nid=0x4594 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C1 CompilerThread0" #9 daemon prio=9 os_prio=2 cpu=62.50ms elapsed=917.22s tid=0x000002052fabe000 nid=0x43b0 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"Sweeper thread" #10 daemon prio=9 os_prio=2 cpu=0.00ms elapsed=917.22s tid=0x000002052fabf800 nid=0x1b04 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Common-Cleaner" #11 daemon prio=8 os_prio=1 cpu=0.00ms elapsed=917.19s tid=0x000002052fa00800 nid=0x46fc in Object.wait() [0x000000bd0f3ff000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait([email protected]/Native Method)
- waiting on <0x000000071222ef90> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
- waiting to re-lock in wait() <0x000000071222ef90> (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:148)
at java.lang.Thread.run([email protected]/Thread.java:829)
at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:134)
"Monitor Ctrl-Break" #12 daemon prio=5 os_prio=0 cpu=15.63ms elapsed=917.14s tid=0x000002052fd57000 nid=0x427c runnable [0x000000bd0f5fe000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0([email protected]/Native Method)
at java.net.SocketInputStream.socketRead([email protected]/SocketInputStream.java:115)
at java.net.SocketInputStream.read([email protected]/SocketInputStream.java:168)
at java.net.SocketInputStream.read([email protected]/SocketInputStream.java:140)
at sun.nio.cs.StreamDecoder.readBytes([email protected]/StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead([email protected]/StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read([email protected]/StreamDecoder.java:178)
- locked <0x0000000712081138> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read([email protected]/InputStreamReader.java:185)
at java.io.BufferedReader.fill([email protected]/BufferedReader.java:161)
at java.io.BufferedReader.readLine([email protected]/BufferedReader.java:326)
- locked <0x0000000712081138> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine([email protected]/BufferedReader.java:392)
at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Service Thread" #13 daemon prio=9 os_prio=0 cpu=0.00ms elapsed=917.14s tid=0x000002052fdd2800 nid=0x4110 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"T1" #14 prio=5 os_prio=0 cpu=0.00ms elapsed=917.14s tid=0x000002052fde4000 nid=0x25f4 waiting on condition [0x000000bd0f8fe000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep([email protected]/Native Method)
at java.lang.Thread.sleep([email protected]/Thread.java:334)
at java.util.concurrent.TimeUnit.sleep([email protected]/TimeUnit.java:446)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor.method1(ThisMonitor.java:15)
- locked <0x0000000712191f68> (a com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor$$Lambda$14/0x0000000800066c40.run(Unknown Source)
at java.lang.Thread.run([email protected]/Thread.java:829)
"T2" #15 prio=5 os_prio=0 cpu=0.00ms elapsed=917.14s tid=0x000002052fdec000 nid=0x3710 waiting for monitor entry [0x000000bd0f9ff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor.method2(ThisMonitor.java:23)
- waiting to lock <0x0000000712191f68> (a com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor$$Lambda$15/0x0000000800066040.run(Unknown Source)
at java.lang.Thread.run([email protected]/Thread.java:829)
"T3" #16 prio=5 os_prio=0 cpu=15.63ms elapsed=917.14s tid=0x000002052fddd800 nid=0x4758 waiting for monitor entry [0x000000bd0faff000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor.method2(ThisMonitor.java:23)
- waiting to lock <0x0000000712191f68> (a com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor)
at com.james.example.thread.jcp_multithread_architecture.chapter4.ThisMonitor$$Lambda$16/0x0000000800066440.run(Unknown Source)
at java.lang.Thread.run([email protected]/Thread.java:829)
"DestroyJavaVM" #17 prio=5 os_prio=0 cpu=140.63ms elapsed=917.14s tid=0x000002052fddf000 nid=0x1744 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"VM Thread" os_prio=2 cpu=0.00ms elapsed=917.25s tid=0x000002052fa1d800 nid=0x32ec runnable
"GC Thread#0" os_prio=2 cpu=0.00ms elapsed=917.26s tid=0x000002050b0f6800 nid=0x47e0 runnable
"G1 Main Marker" os_prio=2 cpu=0.00ms elapsed=917.26s tid=0x000002050b158000 nid=0x44e4 runnable
"G1 Conc#0" os_prio=2 cpu=0.00ms elapsed=917.26s tid=0x000002050b15a800 nid=0x478 runnable
"G1 Refine#0" os_prio=2 cpu=0.00ms elapsed=917.26s tid=0x000002052ea07800 nid=0x31b8 runnable
"G1 Young RemSet Sampling" os_prio=2 cpu=0.00ms elapsed=917.26s tid=0x000002052ea08800 nid=0x1854 runnable
"VM Periodic Task Thread" os_prio=2 cpu=0.00ms elapsed=917.14s tid=0x000002052fdd4800 nid=0x1a10 waiting on condition
JNI global refs: 16, weak refs: 0
jmap
Usage:
jmap -clstats
to connect to running process and print class loader statistics
jmap -finalizerinfo
to connect to running process and print information on objects awaiting finalization
jmap -histo[:live]
to connect to running process and print histogram of java object heap
if the "live" suboption is specified, only count live objects
jmap -dump:
to connect to running process and dump java heap
jmap -? -h --help
to print this help message
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file= dump heap to
Example: jmap -dump:live,format=b,file=heap.bin
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
dump::生成堆转储快照
jmap -dump:live,format=b,file=heap.bin
jmap -histo 12368
可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小
>jmap -histo[:live] 12368
num #instances #bytes class name (module)
-------------------------------------------------------
1: 1067 2741928 [I ([email protected])
2: 9389 689632 [B ([email protected])
3: 8938 286016 java.util.HashMap$Node ([email protected])
4: 315 249592 [C ([email protected])
5: 7634 183216 java.lang.String ([email protected])
6: 890 169400 [Ljava.util.HashMap$Node; ([email protected])
7: 2573 137248 [Ljava.lang.Object; ([email protected])
8: 1055 129008 java.lang.Class ([email protected])
9: 1148 45920 java.util.LinkedHashMap$Entry ([email protected])
10: 1309 41888 java.util.concurrent.ConcurrentHashMap$Node ([email protected])
jmap -dump:live,format=b,file=heap.dump 12368
命令执行 内存信息dump到heap.dump 文件中。JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
>jmap -dump:live,format=b,file=heap.dump 12368
Heap dump file created
导出的dump可通过jvisualvm.exe 分析
jconsole
jvisualvm
JVM常用调优配置解析
Xms Xmx Xmn Xss
-Xms 堆内存的初始大小,默认为物理内存的1/64
-Xmx 堆内存的最大大小,默认为物理内存的1/4
-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx减去-Xmn
-Xss 设置每个线程可使用的内存大小,即栈的大小。在相同物理内存下,减小这个值能生成更多的线程,当然操作系统对一个进程内的线程数还是有限制的,不能无限生成。线程栈的大小是个双刃剑,如果设置过小,可能会出现栈溢出,特别是在该线程内有递归、大的循环时出现溢出的可能性更大,如果该值设置过大,就有影响到创建栈的数量,如果是多线程的应用,就会出现内存溢出的错误。
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:新生代大小
-XX:NewRatio:设置新生代和老年代的比值。如:为3,表示年轻代与老年代比值为1:3
-XX:SurvivorRatio:新生代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:为3,表示Eden:Survivor=3:2,一个Survivor区占整个新生代的1/5
-XX:MaxTenuringThreshold:设置转入老年代的存活次数。如果是0,则直接跳过新生代进入老年代
-XX:PermSize、-XX:MaxPermSize:分别设置永久代最小大小与最大大小(Java8以前)
-XX:MetaspaceSize、-XX:MaxMetaspaceSize:分别设置元空间最小大小与最大大小(Java8以后)
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行老年代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n:设置并发收集器新生代收集方式为并行收集时,使用的CPU数。并行收集线程数。
idea中运行程序时设置VM options
-Xms512M -Xmx512M -Xmn256M -Xss2M -XX:PermSize=128M
参考
https://blog.csdn.net/yrwan95/article/details/82826519
https://blog.csdn.net/qq_33961373/article/details/93174424