CPU分析ios
当程序响应变慢的时候,首先使用top、vmstat、ps等命令查看系统的cpu使用率是否有异常,从而能够判断出是不是cpu繁忙形成的性能问题。缓存
其中,主要经过us(用户进程所占的%)这个数据来看异常的进程信息。当us接近100%甚至更高时,能够肯定是cpu繁忙形成的响应缓慢。通常说来,cpu繁忙的缘由有如下几个:网络
线程中有无限空循环、无阻塞、正则匹配或者单纯的计算。数据结构
发生了频繁的gc : 经过jstat查看gc的log判断多线程
多线程的上下文切换 : 经过vmstat中上下文切换(cs)次数来判断tcp
肯定好cpu使用率最高的进程以后就可使用jstack来打印出异常进程的堆栈信息:工具
jstack [pid]性能
使用jstack只能打印出进程的信息,这些信息里面包含了此进程下面全部线程(轻量级进程-LWP)的堆栈信息。所以,进一步的须要肯定是哪个线程耗费了大量cpu,此时可使用top -p [processId]来查看,也能够直接经过ps -Le来显示全部进程,包括LWP的资源耗费信息。spa
最后,经过在jstack的输出文件中查找对应的lwp的id便可以定位到相应的堆栈信息。其中须要注意的是线程的状态:RUNNABLE、WAITING等。对于Runnable的进程须要注意是否有耗费cpu的计算。对于Waiting的线程通常是锁的等待操做。线程
jstat -gcutil [pid]
也可使用jstat来查看对应进程的gc信息,以判断是不是gc形成了cpu繁忙。
经过vmstat,经过观察内核状态的上下文切换(cs)次数,来判断是不是上下文切换形成的cpu繁忙。
内存分析
对Java应用来讲,内存主要是由堆外内存和堆内内存组成。
1. 堆外内存堆外内存主要是JNI、Deflater/Inflater、DirectByteBuffer(nio中会用到)使用的。对于这种堆外内存的分析,仍是须要先经过vmstat、sar、top、pidstat等查看swap和物理内存的消耗情况再作判断的。此外,对于JNI、Deflater这种调用能够经过Google-preftools来追踪资源使用情况。
2. 堆内内存此部份内存为Java应用主要的内存区域。一般与这部份内存性能相关的有:
建立的对象:这个是存储在堆中的,须要控制好对象的数量和大小,尤为是大的对象很容易进入老年代
全局集合:全局集合一般是生命周期比较长的,所以须要特别注意全局集合的使用
缓存:缓存选用的数据结构不一样,会很大程序影响内存的大小和gc
ClassLoader:主要是动态加载类容易形成永久代内存不足
多线程:线程分配会占用本地内存,过多的线程也会形成内存不足
以上使用不当很容易形成:
频繁GC -> Stop the world,使你的应用响应变慢
OOM,直接形成内存溢出错误使得程序退出。OOM又能够分为如下几种:
Heap space:堆内存不足
PermGen space:永久代内存不足
Native thread:本地线程没有足够内存可分配
IO分析
一般与应用性能相关的包括:文件IO和网络IO。
1. 文件IO可使用系统工具pidstat、iostat、vmstat来查看io的情况。
注意bi和bo这两个值,分别表示块设备每秒接收的块数量和块设备每秒发送的块数量,由此能够断定io繁忙情况。
进一步的能够经过使用strace工具定位对文件io的系统调用。一般,形成文件io性能差的缘由不外乎:
大量的随机读写
设备慢
文件太大
2. 网络IO查看网络io情况,通常使用的是netstat工具。能够查看全部链接的情况、数目、端口信息等。例如:当time_wait或者close_wait链接过多时,会影响应用的相应速度。
还可使用tcpdump来具体分析网络io的数据。固然,tcpdump出的文件直接打开是一堆二进制的数据,可使用wireshark阅读具体的链接以及其中数据的内容。
还能够经过查看/proc/interrupts来获取当前系统使用的中断的状况。
https://mp.weixin.qq.com/s/bM1fLxs0b1BusN2YmfaaIQ