服務端程序除了應用自己性能外,依賴與服務器自己的性能。服務器性能指標包括:CPU、內存、網絡IO和磁盤使用率。
今天學習了內存監控的部分。java
當應用運行所需內存超過可用物理內存時,就會發生頁面交換。一般會在硬盤上分配一個swap空間。當應用耗盡可用內存時,就會把不經常使用的內容放到swap空間裏。 當訪問被置換到swap空間的內容時,就須要把swap空間的內容加載到物理內存中,這種置換操做會大大影響應用的吞吐量和響應性。
JVM垃圾收集器在進行置換操做時,性能也不好。垃圾收集器爲了回收不可達對象,須要大量訪問內存。若是java堆的一部分被置換出去,就必須先置換進來,在掃描存活對象,這會增長GC的時間。GC會形成jvm停頓。 性能優化
[root@Hwseeker-Adx02 ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 4030152 1427780 1159168 87874912 0 0 1 15 0 0 4 1 94 0 0
其中si、so能夠看到swap操做,free表明可用內存數。若是si和so很大,就表明發生了內存置換。服務器
定義幾個概念
讓步試上下文切換:是指線程主動釋放CPU
搶佔式上下文切換:線程由於分配的時間片用盡被迫放棄CPU或被優先級更高的線程搶佔,而失去執行機會 網絡
Java HotSpot VM從1.5開始,增長了鎖機制優化。線程經過忙循環自旋嘗試得到鎖,若是若干次自旋後,沒有獲取成功,則掛起線程,等待喚醒後再次嘗試獲取。掛起和喚醒線程會致使讓步試上線文切換。 jvm
讓步試上下文切換耗費CPU時鐘很是嚴重,一般高達80000個時鐘週期
主頻爲3GHz的處理器每秒鐘可用時鐘週期爲3,000,000,000 ide
[root@dmp002 ~]# pidstat -w -I -p 29064 Linux 2.6.32-573.el6.x86_64 (dmp002.tiger.local) 2018年01月25日 _x86_64_ (24 CPU) 18時34分45秒 PID cswch/s nvcswch/s Command 18時34分45秒 29064 3500 0.02 java
能夠用top命令,獲取pid 性能
pidstat -w顯示系統每秒發生3500個上下文切換。處理器爲3Ghz雙核Intel CPU。所以虛擬處理器上下文切換爲3500/2=1750,耗費的始終週期爲1750*8000=140,000,000。3Ghz每秒鐘週期數爲3,000,000,000。浪費的始終週期爲140,000,000/3,000,000,000=4.7%。學習
讓步時鐘週期佔用超過3%,代表Java應用正面臨鎖競爭
本博文內容爲《Java性能優化權威指南》的讀書筆記整理而來優化