JVM性能监控
有时候我们会碰到下面这些问题:
- OutOfMemoryError,内存不足
- 内存泄露
- 线程死锁
- 锁争用(Lock Contention)
- Java进程消耗CPU过高
这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。
一、 jps(Java Virtual Machine Process Status Tool)
jps [options] [hostid]
如果不指定hostid就默认为当前主机或服务器
(1) -q:只列出JVM进程的id,不展示进程的其他信息
> jps -q -v
26582
26586
26301
27983
(2) -m:输出传递到main方法的参数列表
(3) -l:输出此启动此继承的main方法所在的全package路径、或者JAR的文件路径
> jps -l
26582 org.apache.catalina.startup.Bootstrap
27991 sun.tools.jps.Jps
26586 org.jetbrains.jps.cmdline.Launcher
26301 org.jetbrains.plugins.scala.nailgun.NailgunRunner
(4) -v:输出JVM进程的系统参数,其中包括-D参数和JAVA_OPTS相关参数
>jps -v
18381 Bootstrap -Djava.util.logging.config.file=/opt/deploy/sample-tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xms256m -Xmx256m -XX:NewSize=128m -XX:+DisableExplicitGC -Dlogs=/data/logs -Dcache=/opt/deploy/sample-tomcat/cache -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:/opt/vipkid/homework/logs/gc.log -Djava.endorsed.dirs=/opt/tomcat/endorsed -Djava.io.tmpdir=/opt/deploy/sample-tomcat/temp
二、 jstat(JVM Statistics Monitoring tool)
JVM统计数据监控工具,可以用来查看JVM中GC、类加载等信息
jstat [generalOptions | outputOptions vimd [interval [s|ms] [count]]]
generalOptions没有太大用,我们只需要知道使用“jstat -options”来查看可选参的列表,主要是outputOptions。
(1)-class:有关classLoader的行为统计
> jstat -class 26582
Loaded Bytes Unloaded Bytes Time
13401 28013.1 381 574.4 23.57
loaded:已加载类的个数,bytes:已加载类的字节数,unloaded、bytes:已卸载类的个数和字节数,time:类加载和卸载耗时。
(2) -compiler:统计Hotspot中JIT(just-in-time)编译器的行为,(比较少用)
(3) -gc:堆GC的行为统计,通过此指令我们能了解heap各个区域的内存使用情况
>jstat -gc 26582 2s 100
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
63488.0 10240.0 0.0 10080.0 520192.0 259699.6 1398272.0 1272911.1 92352.0 89826.6 9984.0 9458.4 1089 24.631 11 25.624 50.255
新生代有三块:eden、survivor0、survivor1,其中
- EC、S0C、S1C分别表示上述三个区的compacity(KB)
- EU、S0U、S1U分表表示上述三个区的已使用空间
- OC、OU表示救年老代的空间和使用量
- PC、PU表示持久带的情况
- YGC、YGCT分别表示新生代GC的次数和总时间
- FGC、FGCT表示FULL GC的次数和总时间,GCT表示所有GC的总时间
通常我们可以根据这些参数来观察,JVM内存分布、GC的情况,以便进行调优。(对于互联网系统,通常YGC与FGC相差数倍,即极少的FGC,但是通常YGC会几分钟就会执行一次)
三、 jstack
jstack主要用来查看某个Java进程内的线程堆栈信息.
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.
第一步:找出该进程内最耗费CPU的线程
top -Hp pid

TIME列就是各个Java线程耗费的CPU时间,显然CPU时间最长的是ID为2968的线程,用printf "%x\n" 2968 得到2968的十六进制值为b98,下面会用到.
第二步:用jstack输出进程2860的堆栈信息,然后根据线程ID的十六进制值grep,发下:
# jstack 2860 | grep b98
"SessionTracker" prio=10 tid=0x00007f55a44e4800 nid=0xb53 in Object.wait() [0x00007f558e06c000
可以看到CPU消耗在SessionTracker这个类的Object.wait(),于是就能很容易的定位到相关的代码了。
四、 jmap
通常可以用来查看当前JVM的内存中对象存活情况、跟踪对象创建过程等.
>jmap -heap 26832
using thread-local object allocation.
Parallel GC with 2 thread(s) Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 536870912 (512.0MB)
NewSize = 178782208 (170.5MB)
MaxNewSize = 178782208 (170.5MB)
OldSize = 358088704 (341.5MB)
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 = 102760448 (98.0MB)
used = 54807000 (52.268028259277344MB)
free = 47953448 (45.731971740722656MB)
53.33472271354831% used
From Space:
capacity = 39321600 (37.5MB)
used = 7370120 (7.028694152832031MB)
free = 31951480 (30.47130584716797MB)
18.743184407552082% used
To Space:
capacity = 36700160 (35.0MB)
used = 0 (0.0MB)
free = 36700160 (35.0MB)
0.0% used
PS Old Generation
capacity = 358088704 (341.5MB)
used = 46609072 (44.44987487792969MB)
free = 311479632 (297.0501251220703MB)
13.016068778310304% used
-histo[:live]:根据每个java class类型,打印出相应类的实例个数、内存占用空间(bytes)的直方图,live选项表示只打印存活的对象个数(和占用空间);这个指令可以帮助我们关注JVM中某种class的实例个数和占用内存量,对分析内存消耗、OOM排查有很大帮助。
查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象:jmap -histo[:live] pid
>jmap -histo:live 30402 num #instances #bytes class name
----------------------------------------------
1: 129824 15193328 [C
2: 7631 13005088 [B
3: 127333 3055992 java.lang.String
4: 22984 1308592 [Ljava.lang.Object;
5: 14557 1281016 java.lang.reflect.Method
6: 39153 1252896 java.util.HashMap$Node
7: 8843 997240 java.lang.Class
8: 7260 982096 [Ljava.util.HashMap$Node;
class name是对象类型,说明如下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
五、 jhat
用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。需要注意的是 dump出来的文件还可以用MAT、VisualVM等工具查看.
jmap进行dump命令格式如下:
jmap -dump:format=b,file=dumpFileName pid
如上例所示对进程ID为2860进行Dump:
[root@p]# jmap -dump:format=b,file=/home/dump.dat 2860
Dumping heap to /home/dump.dat ...
Heap dump file created
然后使用jhat来对上面dump出来的内容进行分析。
[root@storm-master Desktop]# jhat -port 8888 /home/dump.dat
Reading from /home/dump.dat...
Dump file created Sat Aug 01 04:21:12 PDT 2015
Snapshot read, resolving...
Resolving 411123 objects...
Chasing references, expect 82 dots..................................................................................
Eliminating duplicate references..................................................................................
Snapshot resolved.
Started HTTP server on port 8888
Server is ready.
注意:如果Dump文件太大,可能需要加上-J-Xmx512m参数以指定最大堆内存,即jhat -J-Xmx512m -port 8888 /home/dump.dat。然后就可以在浏览器中输入主机地址:8888查看了。
JVM性能监控的更多相关文章
- jvm性能监控与故障处理工具
jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具 类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功 ...
- 第八章 JVM性能监控与故障处理工具(2)
注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...
- JVM性能监控与故障处理命令行工具
JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...
- 第七章 JVM性能监控与故障处理工具(1)
1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所 ...
- jvm性能监控(3)-jdk自带工具 jps jstack jmap
一.概要: jps -l 查看现有的java进程 jps -l 显示所有正在运行的java进程id jstack 查看Java线程 jstack -l pid; 做thread dump ...
- jvm性能监控(2)–JVM的监控工具jstat
Jstat是JDK自带的一个轻量级工具,主要用JVM内建的指令对java应用程序的资源和性能进行实时的监控. openjdk没有jstat,jps等命令解决办法 执行以下命令即可:yum insta ...
- JVM性能监控与优化笔记(CPU)
基础 对于CPU层面的监控主要以下几个点: 是否系统态CPU的占用率高 CPU运行队列中待运行的任务数 是否CPU停滞多,每时钟指令数(IPC)少(高级点,对于计算密集型的应用需要关注) 系统态CPU ...
- JVM性能监控与故障处理命令汇总(jps、jstat、jinfo、jmap、jhat、jstack)
给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具才是运用知识处理数据的手段 使用适当的虚拟机监控和分析的工具可以加快我们分析数据.定位解决问题的速度,本文主要介绍了几款服 务器上常用的 ...
- 在k8s集群中,利用prometheus的jmx_exporter进行tomcat的JVM性能监控,并用grafana作前端展示
查找了很多文档,没有完全达到我要求的, 于是,作了一定的调整,成现在这样. 操作步骤如下: 一,准备好两个文件. jmx_prometheus_javaagent-0.3.1.jar jmx_expo ...
随机推荐
- 我所遭遇过的游戏中间件---Redux
我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...
- Informatica 常用组件Filter之三 创建FIL
在 Designer 中,切换到 Mapping Designer 并打开映射. 选择"转换-创建". 选择"过滤器转换",然后输入新的转换名称.过滤器转换的命 ...
- jquery选择器的实现流程简析及提高性能建议!
当我们洋洋得意的使用jquery强大的选择器功能时有没有在意过jquery的选择性能问题呢,其实要想高效的使用jquery选择器,了解其实现流程是很有必要的,那么这篇文章我就简单的讲讲其实现流程,相信 ...
- 可进可退,jQuery图片、视频、flash播放插件prettyPhoto使用记录
一.prettyPhoto简介 prettyPhoto是一款基于jquery的轻量级的lightbox图片播放浏览插件,它不仅支持图片,还同时支持视频.flash.YouTube.iframe和aja ...
- Framework连接oracle数据库以及Cognos服务器出现错误
1:Framework连接oracle数据库时出现下面错误信息 环境: win2008R2 cognos10.2.1, 服务器上已经安装oracle11.2 content manager连接的也是 ...
- svmtrain princomp 出现的问题
错误一: >> modelw = svmstrain(wine_label,wine_data); Undefined function 'svmstrain' for input arg ...
- Mac 显示和隐藏文件
显示和隐藏文件 显示Mac隐藏文件的命令: defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令: def ...
- 【Python学习笔记】
目录 语法 if语句 while循环 字符串常用操作 列表 只读列表元组 字典的使用 语法 if语句 示例 #!/usr/bin/env python user = 'jack' passwd = ' ...
- Genymotion 下载安装常见错误一条龙
Genymotion 安卓模拟器确实比安卓原生的模拟器快,但是除了快就找不到其他优点了... 曾经尝试在VM虚拟机内的Ubuntu系统里面再运行Genymotion的,主要原因是要FQ去下载一些东西, ...
- PD的CDM模型中的三种实体关系
PD的CDM模型中的三种实体关系 本文摘自:http://www.cnblogs.com/syf/articles/2480580.html PD 正向工程使用说明:http://download.c ...