目录
1. 操作系统性能分析介绍
(1)什么是操作系统资源
系统需要分配调度在它平台上的各类运行程序像它申请的资源,操作系统需要格局用户的需求来进行分配和调度,需要把内存,CPU,网络,磁盘等资源分配给对应的应用程序,以便让它执行,以及程序执行结束时回收它的资源以便再使用。
我们需要让系统的所有资源得以最大程度的发挥作用,是以最低廉的成本达到各应用的最佳性能,实现资源最大利用。
(2)用户响应时间=服务器响应时间 + 网络时间
1)服务器响应时间,是指从服务器接收到请求,到该请求的响应处理完毕,并把对应的数据全部发往客户端。包括:
用户发送请求
应用服务器收到用户发送的请求
应用服务器和DB,文件系统交互
应用服务器返回数据
界面显示
2)网络时间的因素有多个,包括:
服务供应商差异
网络延时
网络拥塞
(3)系统的稳定性,可靠性
(4)系统完成一次请求或响应任务,除了上述因素,还会跟这些因素有关:硬件设备,系统设计,网络拓扑图,内部网络连接设备。
(5)当系统出问题时,我们需要排查的点:应用程序,操作系统,服务器设备,网络环节,系统资源等。
2. 系统性能分析思路
2.1 系统性能分析:CPU
首先了解系统处理器的情况:几个逻辑处理器,处理器型号,主频率,cache大小,是否支持超线程技术等。
CPU的执行速度与性能好坏,决定了系统整体的性能的快慢。
CPU的使用率也是重要指标,当CPU处于满负载状态时,我们要结合系统附带的一些监控分析工具,检查相关的系统日志,web服务器应用日志,DB日志等,结合一些命令top, free, uptime, sar等辅助工具分析。
2.2 系统性能分析:内存
可用内存太小时,系统进程会被阻塞中,应用也会变得缓慢,甚至失去响应,引起内存溢出,应用程序被系统杀死,系统重启等。
内存太大时,也是一种浪费。
虚拟内存也是需要考虑的性能指标。当系统的物理内存不够用时,需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用,那些被释放的空间可能来自一些很长时间没什么操作的程序,那些被释放的空间被临时保存到虚拟内存空间中,等到那些程序要运行时,再从虚拟内存中恢复保存的数据到物理内存中。
系统总是在物理内存不够时,才进行内存之间的交换。有时可以越过系统性能瓶颈,节省系统升级费用。因此在性能分析时,要考虑系统有无设置虚拟内存,以及虚拟内存的使用情况。
虚拟内存和物理内存大小的关系:以前,虚拟内存是物理内存的两倍。现在,物理内存本身就比较大了,所以通常虚拟内存达不到物理内存的两倍。
2.3 系统性能分析:network
系统的应用之间的交互:网络带宽,响应时间,网络延迟,阻塞等,都影响系统性能。
不稳定不安全的网络导致的应用程序的问题:超时,丢弃,阻塞,波动率大。
系统中,我们要考虑对应的网络是否可达,防火墙是否开启,端口的访问,带宽是否有被限制,路由的寻址,网络的时延等问题。
2.4 系统性能分析:磁盘 I/O 的利用率和延迟
应用的访问离不开系统的磁盘数据的读写,I/O读写的性能直接会影响系统程序的性能。
读写的性能直接会影响系统程序的性能,磁盘I/O系统是系统中最慢的部分。
需要考虑:I/O的TPS,平均I/O数据,平均队列长度,平均服务时间,平均等待事件,IO利用率(磁盘 busy time%)等指标。
2.5 小结
上述几个因素是相互依赖的,比如:
大量的网络吞吐量会导致CPU的资源增大,此时系统要分出部分资源去进行软件中断处理。
大量的CPU开销会尝试更多的内存使用。
所以,在进行系统优化时,找出瓶颈的真正出处十分关键。
系统的分析思路有两种:
自顶向下,由应用程序往下分析。
自底向上,从操作系统资源往上分析到应用程序。
3. Linux 系统性能分析思路和实践
Linux系统简介。
日益高涨的性能期望转化为对操作系统调度器,内存管理,磁盘以及网路I/O子系统的扩展性加以性能分析和改进。
3.1 系统负载监控分析实践
系统的负载是一个很重要的指标,它的多少决定了系统是否处于忙碌状态。
可以通过top, uptime, w等命令来分析系统的负载。
小结:
(1)uptime的系统存活时间越长,意味着系统越稳定。可以通过这个时间判断系统有无重启。
(2)可以知道当前有几个登录用户,但是w会更好的显示当前用户登录数。
(3)系统的平均负载,是指在特定时间间隔内运行队列中的平均进程数,如果一个进程满足以下条件,则其就会位于运行队列中:
它没有在等待I/O操作的结果
它没有主动进入等待状态(即没调用wait)
没有被停止(等待终止)
注意:通常系统建议每个CPU内核的当前活动进程数最好不大于0.8,证明系统是空闲的。
大于1且不大于3时,如果系统的其他资源都很正常,那么系统的性能也是可以接受的。
任务数大于5时,证明系统的性能有问题。
比如一个四核CPU的主机,当uptime的输出结果超过15,说明当前系统负载非常严重,需要分析当前的进程调度策略。
(4)系统负载的三个值,表示的过去一分钟,五分钟,十五分钟的一个平均值。通过这三个值,可以分析出系统负载的趋势:是否增加,稳固,降低等。
(5) uptime的负载描述的是一个平均值,取的是过去某段时间的平均信息。如果要分析当前的负载,最好用其他命令,比如ps, top等。
(6)uptime是从文件/proc/loadavg文件里读取的,在写程序读取进程负载时,可以读取这个文件,分别表示的是在过去一分钟,五分钟,十五分钟,正在运行的进程数栈进程总数的壁纸,最近运行的进程ID。
3.2 系统监控分析实践
top命令类似于Windows系统的任务管理器工具。
对所有正在运行的进程和系统载荷提供不断更新的概览信息。
类似的命令还有:htop, dstat, nmon, glances
(1)任务队列信息
包含:
当前时间,系统运行时间,当前登录用户数,系统负载平均长度(1,5,15分钟前到现在的平均值)
(2)进程状态信息
Linux系统中,进程信息的五种状态:
1)D:不可中断的睡眠态 Uninterruptible sleep 通常出现在IO阻塞
2)R:运行态 Running or runnable
3)S:睡眠态 Interruptible sleep
4)T:被跟踪或已停止 Stopped
5)Z:僵尸态 process
(3)CPU信息
包括:
用户空间占用CPU百分比,
内核空间占用CPU百分比,
用户进程空间改变过优先级的进程占用CPU百分比,
空闲CPU百分比,
等待输入输出的CPU时间百分比,
硬中断占用CPU百分比,
软中断占用CPU百分比
小结:
1)Cpu(s):表示当前cpu的平均值。按1键,可以显示各个逻辑CPU的使用情况。
2)统计空闲的CPU利用率,我们直接统计%id即可。当id持续过低时,系统需要解决CPU资源问题。
3)统计使用的CPU利用率需要通过1-%id来获取。
4)wa:使用率过高时,要考虑io的性能是否有瓶颈,可以用iostat, sar等命令做进一步分析。
5)hi:使用率过高时,表示当前硬件中断占用很大的百分比。一般硬件中断,我们可以分析文件/proc/interrupts, /proc/irq/pid/smp_affinity, 服务irqbalance是否配置,以及cpu的频率设置。通过这些可以优化系统的硬件中断问题。
6)si:Linux Kernel通过一种软件的方法(可延迟函数)来模拟硬件的中断模式,叫做软中断。常见的软中断和网络有关。比如:把数据包传送到网卡(NET_TX_SOFTIRQ), 从网卡接收数据包(NET_RX_SOFTIRQ), 长时间写日志等。
当软中断出现瓶颈时,系统有个进程叫ksoftirqd, 每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd()函数,来处理自己的中断队列上的软件中断。此时,可以通过该命令来查看进程的ksoftirqd的使用信息:ps aux | grep ksoftirqd
7)Ni:优先级为操作系统用来决定CPU分配的参数,Linux使用round-robin的算法来做CPU排程,优先序越高,所可能获得的CPU时间就越多。可以通过nice命令以更改过的优先序来执行程序。如果未指定程序,则会打印出目前的排程优先序。
8)系统的CPU利用率:us+sy+si。或者1-%id。
(4)内存信息
包括:
物理内存总量
使用的物理内存总量
空闲内存总量
用作内核缓存的内存量
缓冲的交换区总量
交换区总量
使用的交换区总量
空闲交换区总量
小结:
1)buffer和cache的作用是,缩短I/O系统调用的时间,比如读写等。一般一个系统而言,如果cache的值很大,说明cache的文件数多。如果频繁的访问文件都能被命中,很明显会比读取磁盘调用快,磁盘的IO必定会减小。
cache的命中率很关键,如果频繁访问的文件不能被命中,对cache而言是一个很大的浪费,此时应该考虑drop cache。
2)通常说系统的men.free表示的是空闲内存总量,但需要注意的是,虽然buffer/cache会占用一定的物理内存,但是当系统需要内存的时候,这些内存可以立即释放出来,即buffer/cache算可用内存。
3)在做清理cache/buffers时,一个把物理内存的数据同步到磁盘的过程,为了保证在执行完drop cache的过程不丢失数据,需要执行sync命令,sync命令执行同步避免丢失数据。
(5) 进程信息
包括:
PID:进程PID
USER:进程所有者的用户名
PR:优先级
NI:nice值,负值表示高优先级,
VIRT:进程使用的虚拟内存总量,单位kb, VIRT=SWAP+RES
RES:进程使用的,未被换出的物理内存大小,单位kb, RES=CODE+DATA
SHR:共享内存大小,单位kb
%CPU:上次更新到现在的CPU时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的CPU时间总计,单位1/100秒
COMMAND :命令名/命令行
小结:
1)top命令的第六七行显示是所有进程有关的信息,如果要显示线程级信息,用ps
2)进程实际使用的内存是查看RES那一列的信息,VIRT表示的是进程使用的虚拟内存的数据, SHR表示的是共享内存的数据。
3)TIME+表示的是进程使用的CPU时间的踪迹,而非进程的存活时间,且TIME+默认精确单位是到1/100秒,由于TIME+显示的是CPU时间,所以可能存在TIME+大于程序运行时间,也可能小于程序运行时间,这两个没有必然的联系,完全取决于该程序所能分配到的CPU时间而定。
4)%CPU表示的是进程所占用的CPU的百分比,通过这个可以得出进程的CPU利用率。
5)默认情况下系统不会显示进程分布区在哪几个逻辑CPU上,如想分析各个CPU对应的应用程序,可以修改top的默认配置,添加字段Last used CPU即可。
6)还可以自定义一些top配置,可以查看更多的信息
7)常用的修改top的配置包括修改刷新间隔时间,添加字段,删除字段,排序,保存等。
top间隔刷新: 输入top后,按d键,进入间隔刷新配置,输入间隔秒数即可。按enter键退出。
8)添加进程字段显示列
当默认情况的进程信息不能满足时,可以考虑添加一些额外的配置。
此时,输入top命令,按下f键,进入列配置页面。
此时按下A,系统不会再显示PID列,输入d,会在top命令后加入UID列。
9)显示平均/各个CPU的利用率信息
默认情况下,系统是显示平均CPU的利用情况,但很多时候,用户会关心各个CPU的利用情况时,可以在进入top命令后,输入数字1,就可以看到对应的各个CPU的利用情况。
10)注意:上面几种配置因没有加W保存配置,所以当用户退出top交互界面后,下次登录又会重新加载,所以需要在top界面输入字母W保存。即在top后,输入W,会出现下方提示信息。表示将top配置保存进了环境变量,下次读取可以生效。
top脚本问题:
除了top配置之外,还需要注意一些top脚本的问题:
top脚本的作用:通常我们需要持续性的监控系统的资源信息,所以需要了解脚本。
top对应的几个参数:
-b:批处理模式
-c:命令/程序名,触发
-d:设置延迟间隔
-n:设置迭代数量
-p:监控特定的PID
-u 或 -U:用户名,或者UID
1)top监控的日志,重定向到文本中。通常需要带上-b,否则会出现乱码,如下。
2)通常来说,监控有时间频率,默认是3秒。可以通过-d参数来设置。
3)top -n 参数表示的是退出前监控的次数,如想监控三次退出的话,可以输入top -n 3
4)监控脚本 topcpu.sh 参考如下:
#!/bin/bash
# @Function
# TOP CPU Thread INFO.
#
#
#
PROG=`basename $0`
usage() {
cat <<EOF
Usage: ${PROG} [OPTION]...
Java top cpu print the stack of these threads.
Example: ${PROG} -c 10
Options:
-p, --pid java process(use jps find)
-c, --count set the thread count to show, default is 5
-h, --help display this help and exit
EOF
exit $1
}
ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`
[ $? -ne 0 ] && usage 1
eval set -- "${ARGS}"
while true; do
case "$1" in
-c|--count)
count="$2"
shift 2
;;
-p|--pid)
pid="$2"
shift 2
;;
-h|--help)
usage
;;
--)
shift
break
;;
esac
done
count=${count:-5}
redEcho() {
[ -c /dev/stdout ] && {
# if stdout is console, turn on color output.
echo -ne "\033[1;31m"
echo -n "$@"
echo -e "\033[0m"
} || echo "$@"
}
## Check the existence of jstack command!
if ! which jstack &> /dev/null; then
[ -n "$JAVA_HOME" ] && [ -f "$JAVA_HOME/bin/jstack" ] && [ -x "$JAVA_HOME/bin/jstack" ] && {
export PATH="$JAVA_HOME/bin:$PATH"
} || {
redEcho "Error: jstack not found on PATH and JAVA_HOME!"
exit 1
}
fi
uuid=`date +%s`_${RANDOM}_$$
cleanupWhenExit() {
rm /tmp/${uuid}_* &> /dev/null
}
trap "cleanupWhenExit" EXIT
printStackOfThread() {
while read threadLine ; do
pid=`echo ${threadLine} | awk '{print $1}'`
threadId=`echo ${threadLine} | awk '{print $2}'`
threadId0x=`printf %x ${threadId}`
user=`echo ${threadLine} | awk '{print $3}'`
pcpu=`echo ${threadLine} | awk '{print $5}'`
jstackFile=/tmp/${uuid}_${pid}
[ ! -f "${jstackFile}" ] && {
jstack ${pid} > ${jstackFile} || {
redEcho "Fail to jstack java process ${pid}!"
rm ${jstackFile}
continue
}
}
redEcho "The stack of busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) of java process(${pid}) of user(${user}):"
sed "/nid=0x${threadId0x}/,/^$/p" -n ${jstackFile}
done
}
[ -z "${pid}" ] && {
ps -Leo pid,lwp,user,comm,pcpu --no-headers | awk '$4=="java"{print $0}' |
sort -k5 -r -n | head --lines "${count}" | printStackOfThread
} || {
ps -Leo pid,lwp,user,comm,pcpu --no-headers | awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}' |
sort -k5 -r -n | head --lines "${count}" | printStackOfThread
}
4. Windows系统性能分析思路和实践
Windows系统中,除了任务管理器之外,还要一个自带的性能监控工具,叫Performance Monitor。
4.1 性能监视器综述
Performance Monitor本身也是一个进程,运行后也会占用一定的资源,所以看到的资源使用率会比实际的要略高一些。
总体来说,这个工具可以帮助我们分析系统瓶颈时很有用。
在开始-运行中输入perfmon,回车,启动运行界面。
4.2 性能监视器工具介绍
在Windows性能监视器中,工具使用最多的有:性能计数器,事件跟踪数据,配置信息
(1)性能计数器
主要是用来衡量系统状态或活动情况的度量单位,可以包含在操作系统中或作为个别应用程序的一部分,Windows性能监视器以指定的时间间隔请求性能计数器的当前值。
(2)事件跟踪数据
是从跟踪提供程序收集到的,这些跟踪提供程序是操作系统或用于报告操作或时间的个别应用程序的组件,可将多个跟踪提供程序的输出合并大偶一个跟踪会话中。
(3)配置信息
配置信息是从Windows注册表项值收集到的,Windows性能监视器可以在指定时间或间隔记录注册表项值作为日志文件的一部分。
Windows性能监视器组合了以前独立工具的功能,包括性能日志和警报(PLA),服务器性能审查程序(SPA),系统监视器,它提供了自定义数据收集器集和时间跟踪会话的图表界面。性能监视器以实时或查看历史数据的方式显示了内置的Windows性能计数器。可以通过拖放或创建自定义数据收集器集将性能计数器添加到性能监视器。其特征在于可以直观的查看性能日志数据的多个图表视图,可以在性能监视器中创建自定义视图,该视图可以导出为数据收集器集,以便与性能和日志记录功能一起使用。
性能监控工具,有以下几点需要注意:
(1)权限的问题,本地管理员组的成员或同等身份的用户,可以使用windows性能监视器的所有功能,其他的类似User组的成员, Performance Monitor Users组的成员,Performance Log Users组的成员等可能无法创建,修改数据收集器或查看性能监视器中的实时性能数据。
(2)防火墙问题,性能监视器提供远程访问的功能,若要查看远程计算机中的性能计数器,必须在远程计算机上启用“性能日志和警报”防火墙例外。此外,Performance Log Users组的成员还必须为远程计算机上的事件日志读取器组的成员。
4.3 系统监控分析实践
(1)性能监视器显示属性的配置
常见的设置如下:
(2)计算器添加和配置
(3)性能监视器中的日志数据源的配置
(4)信息的保存
(5) 数据收集器的配置
数据收集器是WIndows性能监视器中性能监视和报告的功能块。它将多个数据收集点组织成可用于查看或记录性能的单个组件。可以创建数据收集器集,然后执行这些操作:
逐个记录,与其他数据收集器集组合而且并入到日志中,在性能监视器中查看,配置为达到阈值时生成警报,或者由其他非Microsoft应用程序使用。可以在其与在特定时间收集数据的计划规则关联起来。可将Windows Management Interface(WMI)任务配置为在数据收集器集收集完成之后运行。
备注:
性能计数器:提供有关系统性的度量数据
事件跟踪数据:提供有关活动和系统事件的信息
系统配置信息:可以记录注册表项的状态及对其进行的更改
(6)收集器集的任务管理
备注:
如果已将数据收集器集配置为其他用户身份运行,则每次修改数据收集器集属性时系统会提示输入用户名和密码。
计划调度任务中,选择截止日期不会停止该日期当天正在进行的数据收集,它将从截止日期之后开始阻止数据收集的新实例。必须使用“停止条件”选项卡配置停止数据收集的方式。
(7)配置数据收集器集的数据管理
备注:数据管理器属性
最小可用磁盘:存储日志数据的驱动器上必须具备的可用磁盘空间的大小。如果选择,则达到限制时,将根据选择的资源策略删除以前的数据
最大文件夹数:数据收集器集根据目录中可包含的子文件夹数量。如果选择,则达到显示时,将根据选择的资源策略删除以前的数据
资源策略:指定达到限制时,是否删除最旧或最大的日志文件和目
最大根路径大小:数据收集器集,数据目录的最大大小。如果选择,此项将替代最小可用磁盘和最大文件夹数的限制。当达到限制时,将根据选择的资源策略删除以前的数据。
备注:操作属性
年龄:数据文件以天或周为单位的存留期。如果为0,则不适用这个标准。
大小:存储日志数据的文件夹大小(MB)。如果为0,则不适用这个标准。
Cab:一种存档文件格式的Cab文件。可从原始日志数据创建Cab文件,并在以后需要时进行提取。根据存留期或大小的标准选择创建或删除操作。
数据:数据收集器集的原始日志数据,创建Cab文件之后,可删除日志数据,以便在仍单保留原始数据备份的同时节约磁盘空间。
报告:Windows性能监视器从原始日志数据生成的报告文件,即使在已删除原始数据或Cab文件之后,也可以保留报告文件。
(8)监控报告的查看
4.4 资源监视器介绍和实践
Windows资源监视器是一个功能强大的工具,用于了解进程和服务如何使用系统资源。
除了实时监控资源使用情况外,资源监视器还可以帮助分析没有相应的进程,确定哪些应用程序正在使用文件,以及控制进程和服务。
Windows资源监视器是一个系统工具,用于实时查看有关硬件(CPU, 内存,磁盘和网络)和软件(文件句柄和模块)资源使用情况的信息。可以按照要监视的特定进程或服务来筛选结果。此外,还可以使用资源监视器启动,停止,挂起和回复进程和服务。并在应用程序没有按预期效果响应时进行故障排除。
(1)开始,停止
(2)资源监视器分析(详细解析:略,稍后补)
5. Tomcat监控:Probe
5.1 Tomcat的常规监控项
目前采用Java进行系统开发的系统居多。这些系统运行在Java容器中,通过对容器的监控可以了解到Java程序的运行状况,分析Java程序问题。
最常用的中间件tomcat,遵循Servlet规范。
对容器的监控实际上是对JVM的监控,容器运行在JVM上。
JVM的监控分析工具有很多: JvisualVm, Jconsole, Jprofiler, Zabbix, Nagios, Cacti
Tomcat的常规监控项:
5.2 Probe安装
(可从其他链接下载:Releases · psi-probe/psi-probe · GitHub)
下载Probe的war包,放到%TOMCAT_HOME%/webapps/目录下面。则Tomcat启动时,自动解压并发布Probe监控服务。
5.3 Probe配置
5.4 Probe访问
因为probe访问出问题,所以这里暂时无法实现其监控功能。
待后续排查清楚问题后,再补。
6. MySQL监控指MONyog
6.1 MySQL监控的简单介绍
MySQl监控的实现,可以通过官方提供的客户端,命令或者SQL来完成。
这里介绍一个傻瓜式的性能监控诊断工具MONyog。
6.2 安装MONyog
下载安装软件,这里是试用版本,试用期14天。
双击开始安装,具体的安装步骤比较简单,所以省略图示。
这里重点注意默认的端口。
6.3 启动MONyog,连接配置
6.4 连接成功,进入默认页面,关注性能指标
6.5 MySQL常见的监控项目:
7. JVM监控
7.1 jps
(1)jps命令可以获取系统正在运行的JVM进程号
参数:
-l:返回Java进程全路径
-q:仅显示进程ID
-v:返回JVM参数,比如堆大小,此命令方便我们查看JVM大小,不用去找配置文件
(2)jps [IP]:列出远程机器上的Java进程信息。
但是首先需要安全授权,在远程机器的%JAVA_HOME%/bin/目录下存储 jstatd.all.policy文件。内容为:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
}
然后在远程机器下启动命令,进行注册:
命令:jstatd -J-DJava.security.policy=jstatd.all.policy
(3)远程机器的jstatd启动后,也可以使用本地JVisualvm对远程JVM进行监控。
参考:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
问题:如果机器上有多个JVM进程时,如何确定自己访问的服务对应哪一个Java进程?
答:在访问服务是,URL中会有端口号(默认为80), Linux下可以通过ps命令得知进程号与端口号。
7.2 jstat
(1)jstat的作用
JVM内存不够用,内存溢出等,是通过JVM Heap信息来进行分析的。
jstat可以用来查看JVM堆的统计信息。
(2)jstat命令
jstat [generalOption | outputOptions vmid [ interval [s|ms] [count] ] ]
generalOption代表选项,常用选项有
class:用于查看类加载情况的统计
compiler:用于查看HotSpot中即时编译器情况的统计
gc:用于查看JVM中堆的垃圾收集情况的统计
gccapacity:用于查看新生代,老生代和持久代的存储容量情况
gccause:最后一次及当前正在发生垃圾收集的原因
gcnew:用于查看新生代垃圾收集的情况
gcnewcapacity:用于查看新生代的存储容量情况
gcold:用于查看老生代和持久代发生GC的情况
gcoldcapacity:用于查看老生代的容量
gcpermcapacity:用于查看持久代的容量
printcompilation HotSpot:编译方法的统计
gcutil:GC统计
outputOptions 代表输出格式,参数 interval 和 count 代表查询间隔和查询次数。
(3)实例:
先用jps获取java的进程号,然后由jstat来统计JVM中加载的类的数量与Size。
Loaded:加载类的数目
Bytes:加载类的Size, 单位Bytes
Unloaded:卸载类的数目
Bytes:卸载类的Size, 单位Bytes
Time:加载与卸载类花费的时间
(4)gccapacity统计JVM垃圾回收信息,表头信息解析如下:
NGCMN:年轻代young中初始化大小 Byte
NGCMX:年轻代的最大容量
NGC:年轻代中的当前容量
S0C:年轻代中第一个servivor幸存区的容量
S1C:年轻代中第二个servivor幸存区的容量
EC:年轻代中Eden伊甸园的容量
OGCMN:old代中初始化大小
OGCMX:old代的最大容量
OGC:old代的大小
PGCMN:perm代中初始化大小
PGCMX:perm代的最大容量
PGC:perm代当前新生成的容量
S0U:年轻代中第一个servivor幸存区目前已使用空间
S1U:年轻代中第二个servivor幸存区目前已使用空间
EU:年轻代中Eden目前已使用空间
OC:Old代的容量
OU:Old代目前已使用空间
PC:Perm持久代的容量
PU:Perm持久代目前已使用空间
YGC:JVM启动到采样时,年轻代中gc次数
YGCT:JVM启动到采样时,年轻代中gc所用时间(s)
FGC:JVM启动到采样时,old代(full gc)中gc次数
FGCT:JVM启动到采样时,old代(full gc)中gc所用时间(s)
GCT:JVM启动到采样时,gc用的总时间
OGCMN :老年代最小值
备注:
Full gc 会暂停用户响应,但就是不处理用户请求,等待Full gc完成后响应用户请求,这个等待事件过大就会影响用户体验,所以Full gc 是JVM调优的重点。
(5)gcutil统计JVM垃圾回收信息,表头信息解析如下:
S0C:年轻代中第一个servivor幸存区的容量
S1C:年轻代中第二个servivor幸存区的容量
E:年轻代中Eden已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
YGC:JVM启动到采样时,年轻代中gc次数
YGCT:JVM启动到采样时,年轻代中gc所用时间(s)
FGC:JVM启动到采样时,old代(full gc)中gc次数
FGCT:JVM启动到采样时,old代(full gc)中gc所用时间(s)
GCT:JVM启动到采样时,gc用的总时间
(6)与jps一样,jstat也支持远程监控,也需要先开启安全授权(参考上文jps)
7.3 jmap
(1)jmap的作用
分析程序内存占用,实际上是分析堆内存,使用jmap获取堆快照
(2)jmap命令
jmap -dump:format=b, file=C:\xxx.hprof [pid]
xxx.hprof是堆快照文件,此文件打开需要特定的工具。通常我们用JVisualvm来打开。
(3)用Jvisualvm查看堆快照
7.4 JVisualVM
(1)JvisualVM的作用
JvisualVM是JDK自带的JVM可视化监控工具。
它提供强大的分析能力,可以使用JvisualVM监控堆内存变化情况,线程状态,CPU使用情况,分析线程死锁等。JVisualVM可以监控本地JVM也可以监控远程的JVM, 本地监控无需进行配置,远程监控一般以JMX的方法进行。
(2)远程监控
(3)监控界面分析