java jps jmap jstack jstat jinfo 使用

一.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出来的二进制文件可以使用内存分析工具打开

常见内存分析工具功能对比

产品功能MATJProfilerVisual VM
对象关联分析、深浅堆、GC ROOT、内存泄漏检测、线程分析、提供自定义程序扩展扩展YNN
离线全局分析YNY
内存实时分配情况NYY
OQLYNY
内存分配堆栈、热点比例NYN
堆外内存分析NNN

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.
printcompilationHotSpot编译方法统计。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}

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值