JVM学习-内存监控工具(五)

文章主目录

回到顶部

jstat

注以下命令 后面加个毫秒数可以每多少毫秒采集一次

类加载统计

root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -class 10755

Loaded(加载class的数量kb)  Bytes(所占用空间大小kb)  Unloaded(未加载数量kb)  Bytes(未加载占用空间kb)     Time(时间)   
 15780                      30092.6              210                282.2                         8.39

编译统计

[root@iZ2ze2u21foywir3wp68o6Z dubbo_service]# jstat -compiler 10755
Compiled(编译数量) Failed(失败数量) Invalid(不可用数量)   Time (时间)  FailedType(失败类型) FailedMethod(失败方法)
   20007              3                  0              98.91          1              com/mysql/jdbc/AbandonedConnectionCleanupThread run

gc统计

 jstat -gc 10755 1000 #1秒采集一次
 jstat -gc 1075

 

 

 

复制代码

S0C:年轻代中 To Survivor 的容量(单位 KB);
S1C:年轻代中 From Survivor 的容量(单位 KB);
S0U:年轻代中 To Survivor 目前已使用空间(单位 KB);
S1U:年轻代中 From Survivor 目前已使用空间(单位 KB);
EC:年轻代中 Eden 的容量(单位 KB);
EU:年轻代中 Eden 目前已使用空间(单位 KB);
OC:Old 代的容量(单位 KB);
OU:Old 代目前已使用空间(单位 KB);
MC:Metaspace 的容量(单位 KB);
MU:Metaspace 目前已使用空间(单位 KB);
YGC:从应用程序启动到采样时年轻代中 gc 次数;
YGCT:从应用程序启动到采样时年轻代中 gc 所用时间 (s);
FGC:从应用程序启动到采样时 old 代(全 gc)gc 次数;
FGCT:从应用程序启动到采样时 old 代(全 gc)gc 所用时间 (s);
GCT:从应用程序启动到采样时 gc 用的总时间 (s)。

复制代码

堆内分配统计

jstat -gccapacity 10755

复制代码

NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数

复制代码

新生代gc和内存情况统计

jstat -gcnew 10755

 

 

 

复制代码

S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间

复制代码

老年代gc和内存情况统计

 

 

复制代码

MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

复制代码

老年代垃圾回收统计

 jstat -gcold 10755

老年代内存统计

jstat -gcoldcapacity 10755

 

 

 

复制代码

OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

复制代码

jdk1.7永久代统计

jstat -gcpermcapacity 19570

 

 

 

复制代码

PGCMN:最小永久代容量
PGCMX:最大永久代容量
PGC:当前新生成的永久代空间大小
PC :永久代空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

复制代码

JDK8 下 元数据空间统计

 jstat -gcmetacapacity 10755

1

2

3

4

5

6

7

8

9

10

MCMN:最小元数据容量

MCMX:最大元数据容量

MC:当前元数据空间大小

CCSMN:最小压缩类空间大小

CCSMX:最大压缩类空间大小

CCSC:当前压缩类空间大小

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

  

总结垃圾回收统计

jstat -gcutil 10755

 

1

2

3

4

5

6

7

8

9

10

S0:幸存1区当前使用比例

S1:幸存2区当前使用比例

E:伊甸园区使用比例

O:老年代使用比例

M:元数据区使用比例

CCS:压缩使用比例

YGC:年轻代垃圾回收次数

FGC:老年代垃圾回收次数

FGCT:老年代垃圾回收消耗时间

GCT:垃圾回收消耗总时间

  

回到顶部

jstack

统计线程数量

1

./jstack -l 5014  | grep 'java.lang.Thread.State' | wc -l

 

 各个线程状态

1

./jstack 5014 | grep "java.lang.Thread.State" | sort -nr | uniq -c

 

 

 

高CPU占用排查

用来dump线程的堆栈信息 排查死锁和高cpu代码定位

1

2

3

jstack 19751|grep -A20 5295 //查找5295 并打印后20行

jstack 19751|grep -A20 5295  >/root/threaddump.txt//查找5295 并打印后20行 并输出到指定文件

jstack 19751  >/root/threaddump.txt// dump整个线程堆栈并输出到指定文件

参考:《jvm监控-内存泄露排查》

回到顶部

JMAP

查看jvm配置以及内存信息

1.通过ps -ef找到PID

ps -ef|grep "程序名字"

2.通过jmap打印jvm信息

jmap -heap PID

如果出现: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.191-b12. Target VM is 错误可能是系统装了多jdk,定位到当前jdk 指定使用binn下面的jmap

参考《linux查看jdk安装路径》

复制代码

[root@kuaihe-test3 bin]# ./jmap -heap  19751
Attaching to process ID 19751, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.181-b13
#垃圾回收器信息
using thread-local object allocation. # 指的是本地线程分配缓冲(TLAB,Thread Local Allocation Buffer)。并不是栈上分配(Stack Allocation,HotSpot暂时没有做这项优化)。
Parallel GC with 8 thread(s) #并行 8个gc线程

Heap Configuration:
   MinHeapFreeRatio         = 0 #最小堆使用比例
   MaxHeapFreeRatio         = 100 #最大堆使用比例
   MaxHeapSize              = 4164943872 (3972.0MB)  #最大堆空间大小
   NewSize                  = 87031808 (83.0MB)   #新生代分配大小
   MaxNewSize               = 1388314624 (1324.0MB) #最大新生代可分配大小
   OldSize                  = 175112192 (167.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 = 742391808 (708.0MB)
   used     = 9056640 (8.6370849609375MB)
   free     = 733335168 (699.3629150390625MB)
   1.2199272543697033% used
From Space:
   capacity = 2097152 (2.0MB)
   used     = 0 (0.0MB)
   free     = 2097152 (2.0MB)
   0.0% used
To Space:
   capacity = 13631488 (13.0MB)
   used     = 0 (0.0MB)
   free     = 13631488 (13.0MB)
   0.0% used
PS Old Generation
   capacity = 2776629248 (2648.0MB)
   used     = 2699893784 (2574.8193588256836MB)
   free     = 76735464 (73.1806411743164MB)
   97.23638062030527% used

复制代码

 

配置解读

 View Code

dump内存信息

jmap -dump:format=b,file=/Users/liqiang/Desktop/logs/heap.hprof  pid

查看存活对象情况

复制代码

#只统计存活对象
jmap -histo:live 11230  //只统计存活对象
jmap -histo:live 11230 >/root/histo.txt    //输出到指定路径

#包含未存活对象
jmap -histo 11230
jmap -histo: 11230 >/root/histo.txt    //输出到指定路径

复制代码

查看正在等待执行finalizer方法的对象

jmap -finalizerinfo 10755//10755为PID

 

 

说明当前F-Queue队列中并没有等待Finalizer线程执行finalizer方法的对象。

在jvm回收时标记为垃圾对象,等待被回收时的对象

回到顶部

查看 & 分析 GC 日志

复制代码

-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径

复制代码

参数配置

-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs

gc日志

 View Code

gcviewer

下载地址:https://sourceforge.net/projects/gcviewer/ 将日志拖到gcviewer或者使用gcviewer打开

 

 

 

 各个参数详解见github:https://github.com/chewiebug/GCViewer

GCeasy

将gc日志压缩上传https://www.gceasy.io/index.jsp

各个代分配情况 以及最大峰值使用情况

 

 各个停顿时间的次数和所占百分比 以及最大停顿和平均停顿时间

 

 各个代回收次数 以及停顿时间统计

回到顶部

报错解决

17107: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

1.切换到指定进程的用户执行命令。

2.切换到sdk目录尝试https://www.cnblogs.com/LQBlog/p/12896443.html

 

转载至https://www.cnblogs.com/LQBlog/p/10691903.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值