JVM调优工具jps、jstat、jinfo、jmap、jstack、jvisualvm、top、vmstat、pidstat
1、jpsjps(全称:Java Virtual Machine Process Status Tool)是 java 提供的一个用来显示当前所有 java 进程的 pid 的命令。jps:查看java 进程idjps -v:查看虚拟机启动时的参数列表2、jstatJVM 统计监测工具垃圾回收统计:jstat -gc pid 可以评估程序内存使用及GC压力整体情况,常用jstat -gc pid
1、jps 查看java 进程
jps(全称:Java Virtual Machine Process Status Tool)是 java 提供的一个用来显示当前所有 java 进程的 pid 的命令。
- jps:查看java 进程id
- jps -v:查看虚拟机启动时的参数列表
2、jstat JVM检测GC工具
JVM 统计监测工具
- 垃圾回收统计:
jstat -gc pid
可以评估程序内存使用及GC压力整体情况,常用
jstat -gc pid
1000 10:每间隔1000毫秒执行一次,一共执行10次jstat -gc pid
- S0C:第一个Survivor的大小,单位KB
- S1C:第二个Survivor的大小
- S0U:第一个Survivor的使用大小
- S1U:第二个Survivor的使用大小
- EC:Eden区的大小
- EU:Eden区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间,单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间,单位s
- GCT:垃圾回收消耗总时间,单位s
- 堆内存统计:
jstat -gccapacity
11711 堆内存统计
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0C:第一个Survivor大小
- S1C:第二个Survivor的大小
- EC:Eden区的大小
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:当前老年代大小
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代gc次数
- FGC:老年代GC次数
- 新生代垃圾回收统计:
jstat -gcnew
11711- S0C:第一个Survivor的大小
- S1C:第二个Survivor的大小
- S0U:第一个Survivor的使用大小
- S1U:第二个Survivor的使用大小
- TT:对象在新生代存活的次数
- MTT:对象在新生代存活的最大次数
- DSS:期望的幸存区大小
- EC:Eden区的大小
- EU:Eden区的使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- 新生代内存统计:
jstat -gcnewcapacity
11711
- NGCMN:新生代最小容量
- NGCMX:新生代最大容量
- NGC:当前新生代容量
- S0CMX:最大Survivor1区大小
- S0C:当前Survivor1区大小
- S1CMX:最大Survivor2区大小
- S1C:当前Survivor2区大小
- ECMX:最大Eden区大小
- EC:当前Eden区大小
- YGC:年轻代垃圾回收次数
- FGC:老年代回收次数
- 老年代垃圾回收统计:
jstat -gcold
11711
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- OC:老年代大小
- OU:老年代使用大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
- 老年代内存统计:
jstat -gcoldcapacity
11711
- OGCMN:老年代最小容量
- OGCMX:老年代最大容量
- OGC:当前老年代大小
- OC:老年代大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
- 元数据空间统计:
jstat -gcmetacapacity
11711
- MCMN:最小元数据容量
- MCMX:最大元数据容量
- MC:当前元数据空间大小
- CCSMN:最小压缩类空间大小
- CCSMX:最大压缩类空间大小
- CCSC:当前压缩类空间大小
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
- 展示gc概要信息:
jstat -gcutil
11711
- S0:Survivor1区当前使用比例
- S1:Survivor2区当前使用比例
- E:Eden区使用比例
- O:老年代使用比例
- M:元数据区使用比例
- CCS:压缩使用比例
- YGC:年轻代垃圾回收次数
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
- 展示类加载信息
jstat -class
11711
- Loaded:加载的class数量
- Bytes:加载的class类大小, 单位KB
- Unloaded:未加载的class数量
- Bytes:未加载的class类大小, 单位KB
3、jinfo 查看Java应用程序的扩展参数
查看正在运行的Java应用程序的扩展参数
- 查看jvm的参数:
jinfo -flags
11711
- 查看java系统参数:jinfo -sysprops
11711
4、jmap 查看Java程序堆信息
生成堆转储快照,可以用于查看堆内存信息,实例个数以及占用内存大小
- 查看历史生成的实例:
jmap -histo
11711 - 查看当前存活的实例,执行过程中可能会触发一次full gc:
jmap -histo:live
11711,建议执行时可以输出到文本中,jmap -histo 11711 > jmapHisto.txt
- num:序号
- instances:实例数量
- bytes:占用空间大小
- class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[][]
- 堆信息:
jamp -heap
11711
Heap Configuration:
MinHeapFreeRatio = ##在堆的使用率小于40%的时候进行收缩,当Xmx=Xms的时候此配置无效
MaxHeapFreeRatio = ##在堆使用率大于70%的时候进行扩展,当Xmx=Xms的时候此配置无效
MaxHeapSize = ##堆的最大空间
NewSize = ##新生代的大小
MaxNewSize = ##最大的新生代的大小
OldSize = ##老年代的大小
NewRatio = ##新生代中Eden和和Survivor区的比例为 8:1:1
SurvivorRatio =
MetaspaceSize = ##元空间的大小
G1HeapRegionSize = 0 (0.0MB) ##使用G1垃圾收集的区间
- 堆内存dump到当前目录jmap.hprof文件下:jmap -dump:format=b,file=jmap.hprof 11711
- 也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./ (路径)
- 也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
5、jstack 查看线程快照
虚拟机生成当前线程的快照,用户分析线程出现长时间卡顿的原因,如线程之间死锁,死循环,请求外部资源导致线程长时间等待等问题
- “Thread-1” 线程名
- prio=5 优先级=5
- tid=0x000000001fa9e000 线程id
- nid=0x2d64 线程对应的本地线程标识nid
- java.lang.Thread.State: 线程状态
6、jvisualvm jvm提供的图形化分析工具
jdk的bin安装目录下启动,可以远程(不建议)连接,也看加载dump文件
./jvisualvm
7、mat eclipse的dump分析工具
可以单独下载安装mat,下载地址,注意新版需要jdk11+,个人觉得比jvisualvm更好用
8、top 查看linux内存信息
使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如11711
按H,获取每个线程的内存情况
如果java启动后发现cpu居高不下或者异常,找到内存和cpu占用最高的线程tid,比如19664
转为十六进制得到 0x4cd0,此为线程id的十六进制表示
执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
查看对应的堆栈信息找出可能存在问题的代码
9、vmstat 指定采样周期和次数的功能性监测工具
Linux命令行工具vmstat
是一款指定采样周期和次数的功能性监测工具,可以使用它监控进程上下文切换
的情况。
vmstat 1 3 命令行代表每秒收集一次性能指标,总共获取 3次。以下为上图中各个性能指标的注释:
- procs
- r:在运行队列中等待运行的进程数
- b:在等待io的进程数
- memory
- swpd:已使用的交换内存(kb)
- free:空闲的内存(kb)
- buff:用来作为缓冲的内存(kb)
- cache:用作
高速缓存
的内存大小(kb)
- swap
- si:从磁盘交换到内存的交换页数量(kb/秒)
- so:从内存交换到磁盘的交换页数量(kb/秒)
- io
- bi:发送到块设备的块数
- bo:从块设备接收到的块数
- system
- in:每秒中断数
- cs:每秒上下文切换次数
- cpu
- us:用户进程 CPU 使用时间
- sy:内核进程 CPU 使用时间
- id:CPU空闲时间
- wa:等待 I/O 所消耗CPU的时间
- st:从虚拟机设备中获取的时间
10、pidstat 进程上下文切换
Linux命令行工具pidstat
命令就可以帮助我们监测到具体进程
的上下文切换。
常用参数:
- -u:默认参数,显示各个进程的 cpu 使用情况;
- -r:显示各个进程的内存使用情况;
- -d:显示各个进程的 I/O 使用情况;
- -w:显示每个进程的上下文切换情况;
- -p:指定进程号;
- -t:显示进程中线程的统计信息
pidstat -w -p pid
命令行,我们可以查看到进程的上下文切换
:
- cswch/s:每秒主动任务上下文切换数量
- nvcswch/s:每秒被动任务上下文切换数量
pidstat -w -p pid -t
命令行,我们可以查看到具体线程的上下文切换
:
更多推荐
所有评论(0)