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

相關文章
相關標籤/搜索