111111111111111 java性能调优

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

相关文章
相关标签/搜索