JVM 常用调优定位问题命令

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

启动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

你可能感兴趣的:(JVM 常用调优定位问题命令)