一.jps
jps命令主要用来查看当前的Java进程。相比ps或者tasklist命令更容易定位到想要查看的java进程。主要的命令如下
那么这些参数都有什么作用呢,
-q 展示pid不显示其他信息效果如下
-v 展示传递给jvm的命令行选型
-m 展示传递给主类的参数
-l 展示Java 进程的 PID 和完整的主类名。
后面的hostid可以指定对应的机器地址,对应的机器需要开启jmx。
二. jmap
首先help返回信息如下
-heap 打印堆栈信息
以这个举例
Parallel GC with 13 thread(s)
表示 JVM 使用了并行垃圾收集器,并且有 13 个线程来执行垃圾回收。
MinHeapFreeRatio = 0
最小堆空闲比例为 0%,即最小堆空间可以完全被占用。
MaxHeapFreeRatio = 100
最大堆空闲比例为 100%,即最大堆空间可以完全空闲。
MaxHeapSize = 4234149888 (4038.0MB)
最大堆大小为 4038.0MB。-Xmx 可以调整,默认为内存的1/4,默认初始大小为内存的1/64。
NewSize = 88604672 (84.5MB)
新生代初始大小为 84.5MB。 -XX:NewSize了调整
MaxNewSize = 1411383296 (1346.0MB)
新生代最大大小为 1346.0MB。由于老年代:新生代比例默认是2,所以这里是堆的1/3。可通过-XX:NewRatio直接 调整大小。也可通过-XX:MaxNewSize调整。
OldSize = 177733632 (169.5MB)
老年代初始大小为 169.5MB。为新生代2倍。
NewRatio = 2
新生代与老年代的比例为 1:2。-XX:NewRatio可调整
SurvivorRatio = 8
Eden 区与 Survivor 区的比例为 8:1。-XX:SurvivorRatio可调整
MetaspaceSize = 21807104 (20.796875MB)
Metaspace 的初始大小为 20.796875MB。-XX:MetaspaceSize可调整,当触发这个阈值时,会触发FullGc并扩容
CompressedClassSpaceSize = 1073741824 (1024.0MB)
压缩类空间大小为 1024.0MB。
MaxMetaspaceSize = 17592186044415 MB
Metaspace 的最大大小为 17592186044415 MB,实际上这个值非常大,几乎不受限制。
G1HeapRegionSize = 0 (0.0MB)
这个值为 0,表示没有使用 G1 垃圾收集器。
然后我们再来看到实际,会发现几个有趣的地方
1.似乎from to的比例不是1:1,而Eden和Survivor比例也不是8:1,新生代:老年代也不是1:2。
这是为什么呢,实际上使用java1.8默认使用的并行GC时是默认开启了AdaptiveSizePolicy,会去动态的调整大小。这里就不展开说了。
-histo 列出堆中所有对象的数量和总大小。
jmap -histp:live <pid> > xx.txt (输出到某个文件查看,不然终端太长不好查看)
live参数是查看存活的
instances 是实例数,bytes是占用大小, class name是类名
-clstats 显示类装载统计信息
sun/reflect/DelegatingClassLoader它主要实现了类装载的委托机制,并且在反射操作中被广泛使用。
-finalizerinfo 所有等待 finalize 方法执行的对象。
-dump 生成堆转储文件
可以用 jmap -dump:live,format=b,file=dump.bin pid dump当前存活的堆信息,也可与添加参数-XX:+HeapDumpOnOutOfMemoryError 在oom时dump用于分析oom原因
dump出来的二进制文件可以使用内存分析工具打开
常见内存分析工具功能对比
产品功能 | MAT | JProfiler | Visual VM |
---|---|---|---|
对象关联分析、深浅堆、GC ROOT、内存泄漏检测、线程分析、提供自定义程序扩展扩展 | Y | N | N |
离线全局分析 | Y | N | Y |
内存实时分配情况 | N | Y | Y |
OQL | Y | N | Y |
内存分配堆栈、热点比例 | N | Y | N |
堆外内存分析 | N | N | N |
dump 改后缀为hprof可用jprofile打开,也可以直接用mat打开,mat下载地址Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
堆栈外内存溢出排查可结合 gperftools 与 btrace 排查
三.jstack
jstack -l pid 打印 Java 进程中所有线程的堆栈跟踪信息的工具,帮助诊断线程挂起、死锁等问题。
线程基本信息
线程 ID: #176
优先级: prio=5
操作系统优先级: os_prio=0
线程 ID (Java): tid=0x0000021e0db9e800
线程 ID (Native): nid=0x9534
状态: runnable
线程栈地址: [0x000000a463afe000]
线程状态
java.lang.Thread.State: RUNNABLE: 当前线程处于运行状态。
Netty 选择器操作:
线程正在执行 sun.nio.ch.WindowsSelectorImpl 中的选择器操作。
poll0 方法是一个本地方法,用于轮询网络事件。
doSelect 方法实现了选择器的具体选择逻辑。
多个对象被锁定:
SelectedSelectionKeySet 对象
Collections$UnmodifiableSet 对象
WindowsSelectorImpl 对象
Netty 事件循环:
NioEventLoop 类负责处理网络 I/O 操作。
select 方法用于选择就绪的通道。
run 方法是事件循环的核心,不断处理各种事件。
线程执行器:
SingleThreadEventExecutor 是 Netty 中的单线程执行器。
ThreadExecutorMap 和 FastThreadLocalRunnable 用于管理线程本地变量。
Locked Synchronizers
Locked ownable synchronizers: - None: 表示当前线程没有持有任何独占锁。
表明线程正在进行网络 I/O 操作,具体是在等待或处理网络事件。
四 jstat
-gc 显示垃圾收集的统计信息。
S0C (Survivor Space 0 Capacity)
当前 Survivor Space 0 的容量大小。
示例值:37376.0 KB
S1C (Survivor Space 1 Capacity)
当前 Survivor Space 1 的容量大小。
示例值:19968.0 KB
S0U (Survivor Space 0 Usage)
当前 Survivor Space 0 的使用量。
示例值:0.0 KB
S1U (Survivor Space 1 Usage)
当前 Survivor Space 1 的使用量。
示例值:19466.1 KB
EC (Eden Space Capacity)
Eden 区域的总容量。
示例值:1228288.0 KB
EU (Eden Space Usage)
Eden 区域的当前使用量。
示例值:475138.2 KB
OC (Old Gen Capacity)
老年代 (Old Generation) 的总容量。
示例值:328704.0 KB
OU (Old Gen Usage)
老年代 (Old Generation) 的当前使用量。
示例值:157308.3 KB
MC (Metaspace Capacity)
Metaspace 的总容量。
示例值:119384.0 KB
MU (Metaspace Usage)
Metaspace 的当前使用量。
示例值:113715.5 KB
CCSC (Compressed Class Space Capacity)
压缩类空间 (Compressed Class Space) 的总容量。
示例值:14464.0 KB
CCSU (Compressed Class Space Usage)
压缩类空间 (Compressed Class Space) 的当前使用量。
示例值:13469.0 KB
YGC (Young Gen Collection Count)
年轻代垃圾收集次数。
示例值:19 次
YGCT (Young Gen Collection Time)
年轻代垃圾收集总耗时(单位:秒)。
示例值:0.232 秒
FGC (Full Garbage Collection Count)
全局垃圾收集次数。
示例值:4 次
FGCT (Full Garbage Collection Time)
全局垃圾收集总耗时(单位:秒)。
示例值:0.340 秒
GCT (Garbage Collection Total Time)
所有垃圾收集总耗时(单位:秒)。
示例值:0.572 秒
-gccapacity: 显示垃圾收集器的容量信息。
NGCMN (New Gen Committed Min)
新生代(New Generation)最小占用的内存大小。
示例值:86528.0 KB
NGCMX (New Gen Committed Max)
新生代(New Generation)最大占用的内存大小。
示例值:1378304.0 KB
NGC (New Gen Capacity)
新生代当前的总容量。
示例值:1325568.0 KB
S0C (Survivor Space 0 Capacity)
当前 Survivor Space 0 的容量大小。
示例值:21504.0 KB
S1C (Survivor Space 1 Capacity)
当前 Survivor Space 1 的容量大小。
示例值:42496.0 KB
EC (Eden Space Capacity)
Eden 区域的总容量。
示例值:1175040.0 KB
OGCMN (Old Gen Committed Min)
老年代(Old Generation)最小占用的内存大小。
示例值:173568.0 KB
OGCMX (Old Gen Committed Max)
老年代(Old Generation)最大占用的内存大小。
示例值:2756608.0 KB
OGC (Old Gen Capacity)
老年代当前的总容量。
示例值:328704.0 KB
OC (Old Gen Usage)
老年代当前的使用量。
示例值:328704.0 KB
MCMN (Metaspace Committed Min)
Metaspace 最小承诺的内存大小。
示例值:0.0 KB
MCMX (Metaspace Committed Max)
Metaspace 最大承诺的内存大小。
示例值:1155072.0 KB
MC (Metaspace Capacity)
Metaspace 当前的总容量。
示例值:119384.0 KB
CCSMN (Compressed Class Space Committed Min)
压缩类空间(Compressed Class Space)最小占用的内存大小。
示例值:0.0 KB
CCSMX (Compressed Class Space Committed Max)
压缩类空间(Compressed Class Space)最大占用的内存大小。
示例值:1048576.0 KB
CCSC (Compressed Class Space Capacity)
压缩类空间当前的总容量。
示例值:14464.0 KB
YGC (Young Gen Collection Count)
年轻代垃圾收集次数。
示例值:20 次
FGC (Full Garbage Collection Count)
全局垃圾收集次数。
示例值:4 次
-class: 显示类加载的统计信息。
Loaded (Loaded Classes)
当前已加载的类的数量。
示例值:20441
Bytes (Bytes Used by Loaded Classes)
已加载类占用的字节数。
示例值:40202.8 KB
Unloaded (Unloaded Classes)
自应用程序启动以来已被卸载的类的数量。
示例值:189
Bytes (Bytes Used by Unloaded Classes)
已卸载类占用的字节数。
示例值:253.2 KB
Time (Time Spent Unloading Classes)
类卸载所花费的时间(单位:秒)。
示例值:13.17 秒
-compiler: 显示编译器的统计信息。
已编译的方法 (Compiled)
已经编译的方法数量为 14605 个。
这表明应用程序中有大量的方法已经被 JIT 编译器编译成机器码。
编译失败的方法 (Failed)
编译失败的方法数量为 4 个。
这表明有少量方法在编译过程中出现了问题。
无效化的方法 (Invalidated)
被无效化的方法数量为 0 个。
这表明没有方法因为某些原因被无效化。
编译所花费的时间 (Time)
编译所花费的时间为 4.92 秒。
这表示编译过程花费了一定的时间,可能会影响应用程序的性能。
编译失败的类型 (FailedType)
编译失败的类型为 1。
- 0:no_compile:没在编译
- 1:normal_compile:普通编译(从方法正常入口开始编译)
- 2:osr_compile:On-Stack Rreplacement编译(从方法中某个循环的回边开始编译)
- 3:native_compile:native wrapper的编译
这通常表示编译失败的原因是某种特定类型的错误。
编译失败的具体方法 (FailedMethod)
其他命令
gcutil | 垃圾回收统计概述。Summary of garbage collection statistics. |
gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行为统计。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行为统计。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行为统计。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot编译方法统计。HotSpot compilation method statistics. |
五.jinfo
-flag <name>
查询或设置指定的 JVM 标志。
示例:jinfo -flag UseConcMarkSweepGC pid
-sysprops
显示所有系统属性。
示例:jinfo -sysprops pid
-flag <name> <value>
设置指定的 JVM 标志。
示例:jinfo -flag UseParallelGC true pid
注意这里能够设置的只有一部分
intx CMSTriggerInterval = -1 {manageable}
intx CMSWaitDuration = 2000 {manageable}
bool HeapDumpAfterFullGC = false {manageable}
bool HeapDumpBeforeFullGC = false {manageable}
bool HeapDumpOnOutOfMemoryError = false {manageable}
ccstr HeapDumpPath = {manageable}
uintx MaxHeapFreeRatio = 100 {manageable}
uintx MinHeapFreeRatio = 0 {manageable}
bool PrintClassHistogram = false {manageable}
bool PrintClassHistogramAfterFullGC = false {manageable}
bool PrintClassHistogramBeforeFullGC = false {manageable}
bool PrintConcurrentLocks = false {manageable}
bool PrintGC = false {manageable}
bool PrintGCDateStamps = false {manageable}
bool PrintGCDetails = false {manageable}
bool PrintGCID = false {manageable}
bool PrintGCTimeStamps = false {manageable}