一、top命令
- top //每隔5秒顯式所有進程的資源佔用情況
- top -d 2 //每隔2秒顯式所有進程的資源佔用情況
- top -c //每隔5秒顯式進程的資源佔用情況,並顯示進程的命令行參數(默認只有進程名)
- top -p 12345 -p 6789//每隔5秒顯示pid是12345和pid是6789的兩個進程的資源佔用情況
- top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的進程的資源使用情況,並顯式該進程啓動的命令行參數
二、CPU打滿問題排查
- 查找進程id: top
- 查找進程中耗cpu比較高的線程id: top -p pid -H (top -Hp pid)
- 線程id十進制轉十六進制: printf %x 線程id
- 通過棧信息定位具體代碼: jstack pid | grep -A 20 線程id
三、內存打滿問題排查
- 查找進程id:top -d 2 -c
- 查看JVM堆內存分配情況:jmap -heap pid
- 查看佔用內存比較多的對象 jmap -histo pid | head -n 100 ,查看佔用內存比較多的存活對象 jmap -histo:live pid | head -n 100
四、JVM調優
1、性能屬性
- 吞吐量:是評價垃圾收集器能力的重要指標之一,是不考慮垃圾收集引起的停頓時間或內存消耗,垃圾收集器能支撐應用程序達到的最高性能指標。
- 延遲:評價垃圾收集器能力的重要指標,度量標準是縮短由於垃圾收集引起的停頓時間或完全消除因垃圾收集所引起的停頓,避免應用程序運行時發生抖動。
- 內存佔用: 垃圾收集器流暢運行所需要的內存數量……
2、原則
- MinorGC儘可能多的收集垃圾對象。我們把這個稱作MinorGC原則,遵守這一原則可以降低應用程序FullGC 的發生頻率。FullGC 較耗時,是應用程序無法達到延遲要求或吞吐量的罪魁禍首。
- 處理吞吐量和延遲問題時,垃圾處理器能使用的內存越大,即java堆空間越大垃圾收集效果越好,應用運行也越流暢。這稱之爲GC內存最大化原則。
- 在這三個屬性(吞吐量、延遲、內存)中選擇其中兩個進行jvm調優。稱之爲GC調優3選2。
3、堆內存
3.1、初始堆空間大小設置
使用系統默認配置在系統穩定運行一段時間後查看記錄內存使用情況:Eden、survivor0 、survivor1 、old、metaspace
按照通用法則通過gc信息分配調整大小,整個堆大小是Full GC後老年代空間佔用大小的3-4倍
- 老年代大小爲Full GC後老年代空間佔用大小的2-3倍
- 新生代大小爲Full GC後老年代空間佔用大小的1-1.5倍
- 元數據空間大小爲Full GC後元數據空間佔用大小的1.2-15.倍
- 按照這個通用法則先粗略調整各個內存大小……
- 活躍數大小是應用程序運行在穩定態時,長期存活的對象在java堆中佔用的空間大小。也就是在應用趨於穩太時FullGC之後Java堆中存活對象佔用空間大小。(注意在jdk8中將jdk7中的永久代改爲元數據區,metaspace 使用的物理內存,不佔用堆內存)
3.2、堆大小調整的着手點、分析點
- 統計Minor GC 持續時間
- 統計Minor GC 的次數
- 統計Full GC的最長持續時間
- 統計最差情況下Full GC頻率
- 統計GC持續時間和頻率對優化堆的大小是主要着手點,我們按照業務系統對延遲和吞吐量的需求,在按照這些分析我們可以進行各個區大小的調整……
4、年輕代
MinorGC是收集eden+from survivor 區域的,當業務系統勻速生成對象的時候如果年輕帶分配內存偏小會發生頻繁的MinorGC,如果分配內存過大則會導致MinorGC停頓時間過長,無法滿足業務延遲性要求。所以按照堆分配空間分配之後分析gc日誌,看看MinorGC的頻率和停頓時間是否滿足業務要求。
- 老年代空間大小不應該小於活躍數大小1.5倍。老年代空間大小應爲老年代活躍數2-3倍。
- 新生代空間至少爲java堆內存大小的10% 。新生代空間大小應爲1-1.5倍的老年代活躍數。
- 在調小年輕代空間時應保持老年代空間不變。
- gc 配置參數: -server -Xms460M -Xmx460M -Xss512k -Xmn140M -XX:MetaspaceSize=460M -XX:MaxMetaspaceSize=256M -XX:InitialHeapSize=460M -XX:MaxHeapSize=460M -XX:NewRatio=3 堆大小無關數據省略……
5、老年代
- 分析每次MinorGC 之後老年代空間佔用變化,計算每次MinorGC之後晉升到老年代的對象大小。
- 按照MinorGC頻率和晉升老年代對象大小計算提升率即每秒鐘能有多少對象晉升到老年代。
- FullGC之後統計老年代空間被佔用大小計算老年帶空閒空間,再按照第2部計算的晉升率計算該老年代空閒空間多久會被填滿而再次發生FullGC,同樣觀察FullGC 日誌信息,計算FullGC頻率,如果頻率過高則可以增大老年代空間大小老解決,增大老年代空間大小應保持年輕代空間大小不變
- 如果在FullGC 頻率滿足優化目標而停頓時間比較長的情況下可以考慮使用CMS、G1收集器。併發收集減少停頓時間