java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略
一、性能測試
Ⅰ.測試方法
- 可以精準定位到某個模塊或者某個方法的性能問題,例如對比一個方法使用同步實現和非同步實現的性能差異
- 宏基準性能測試是一個綜合測試,需要考慮到測試環境、測試場景和測試目標
- 測試環境:模擬線上的真實環境
- 測試場景:在測試某個接口時,是否有其他業務的接口也在平行運行,進而造成干擾
- 測試目標
- 可以通過吞吐量和響應時間來衡量系統是否達標,如果不達標,就需要進行優化
- 如果達標,就繼續加大測試的并發數,探底接口的TPS
- 除了關注接口的吞吐量和響應時間外,還需要關注CPU、內存和IO的使用率情況
Ⅱ.干擾因素
1.熱身問題
①. 在Java編程語言和環境中,.java文件編譯成.class文件后,需要通過解析器將字節碼轉換成本地機器碼才能運行
②. 為了節約內存和執行效率,代碼在最初被執行時,解析器會率先解析執行這段代碼
③. 隨著代碼被執行的次數增加,當JVM發現某個方法或代碼塊運行得很頻繁時,就會把這些代碼認定為熱點代碼
- 為了提高熱點代碼的執行效率,在運行時,JVM將通過即時編譯器(JIT)把這些代碼編譯成與本地平臺相關的機器碼
- 并進行各層次的優化,然后存儲在內存中,之后每次運行代碼時,直接從內存中獲取
④. 因此在剛開始運行的階段,JVM會花費很長的時間來全面優化代碼,后面就能以最高性能運行了
2. 測試結果不穩定
①. 不穩定因素:機器其他進程的影響、網絡波動、JVM GC的不確定性
①. 解決方案:通過多次測試,將測試結果求平均,只要能保證平均值在一個合理的范圍之內,并且波動不大即可
3. 多JVM
①. 任意一個JVM都擁有整個系統的資源使用權
②. 如果一臺機器上只部署單獨的一個JVM,在做性能測試時,測試結果會很好,但一臺機器上有多個JVM,則不一定
③. 盡量避免線程環境一臺機器部署多個JVM
二、性能分析
1.完成性能測試之后,需要輸出一份性能測試報告,測試結果需要包括
- 測試接口的吞吐量和響應時間(平均、最大、最小)
- 服務器的CPU、內存、磁盤IO、網絡IO使用率、JVM的GC情況
2.通過觀察性能指標,可以發現性能瓶頸,再通過自下而上的方式分析查找問題
- 首先從操作系統層面,查看系統的CPU、內存、磁盤IO、網絡IO的使用率是否存在異常
- 再通過命令查找異常日志,通過分析日志,尋找導致性能瓶頸的原因
- 還可以從Java應用的JVM層面下手,查看JVM的GC頻率以及內存分配情況是否存在異常
- 如果系統和JVM層面都沒有出現異常情況,可以查看應用服務業務層是否存在性能瓶頸
- 例如Java編程的問題、讀寫數據瓶頸
3.分析查找性能問題可以采用自下而上的方式,而解決性能問題,一般采用自上而下的方式逐級優化
三、性能調優
思路:業務調優 -> 編程調優 -> 系統調優
Ⅰ. 優化代碼
1.應用層的問題代碼往往會因為耗盡系統資源而暴露出來
2.例如某段代碼導致內存溢出,這往往是將JVM的內存耗盡了
- 這會引發JVM頻繁地發生GC,導致CPU居高不下,此時也會耗盡系統的CPU資源
3.還有一些非問題代碼導致的性能問題,比較難以發現
- 例如如果對LinkedList進行for循環遍歷,每次循環獲取元素時,都會遍歷一次list,讀效率很低
- 優化方案:可以采用Iterator
Ⅱ. 優化設計
1.面向對象有很多設計模式,可以用于優化業務層以及中間件層的代碼設計,進而達到精簡代碼和提高整體性能的目的
2.例如單例模式在頻繁創建對象的場景中,可以共享一個對象,減少頻繁創建和銷毀對象帶來的性能開銷
Ⅲ. 優化算法
1.合適的算法可以大大提升系統性能
2.例如在不同的場景中,使用合適的查找算法可以降低時間復雜度
Ⅳ. 時間換空間
1.如果系統對查詢的速度沒有很高的要求,但對存儲空間要求苛刻,可以考慮用時間換空間
2.例如String的intern方法,可以將重復率比較高的數據存儲在常量池,重復使用相同的對象,大大節省內存空間
- 但由于常量池使用的是HashMap類型,如果存儲數據過多,就會導致查詢性能下降
Ⅴ. 空間換時間
1.使用存儲空間來提升訪問速度
2.例如MySQL的分庫分表
Ⅵ. 參數調優
1.根據業務場景,合理地設置JVM的內存空間和GC算法
2.另外,合理地設置Web容器的線程池大小和Linux操作系統的內核參數
四、兜底策略
1.性能優化策略,主要為了提高系統性能,而兜底策略,主要為了確保系統的穩定性
2.限流
- 對系統的入口設置最大訪問限制,參考性能測試中探底的接口TPS
- 同時采用熔斷措施,友好地返回沒有成功的請求
3.智能橫向擴容
- 當訪問量超過某一個閾值時,系統可以根據需求自動橫向擴容
4.提前擴容
- 常用于高并發系統,例如瞬時搶購
- 此時智能橫向擴容無法滿足大量發生在瞬間的請求
5.Kubernetes可以實現智能橫向擴容和提前擴容Docker服務
五、總結
寫在最后的雞湯
加油努力吧!比你優秀的對手在學習,你的仇人在磨刀,你的閨蜜在減肥,隔壁老王在練腰, 我們必須不斷學習,否則我們將被學習者超越!
趁年輕,使勁拼,給未來的自己一個交代!
更多資料
資料免費獲取方式:轉發,轉發+關注后私信【架構】即可獲取資料免費領取方式!
領取資料的朋友就有一些忘記私信而錯過寶貴資料,所以關鍵別忘了轉發后私信哦!
這些資料都以整理成了PDF文檔,如果有需要獲取到這個群里面的文檔的話幫忙轉發一下然后再關注我私信回復“架構”得到獲取方式吧!即可進群獲取下載!!!
更多Java架構進階資料展示
總結
以上是生活随笔為你收集整理的java获取cpu使用率_2019年阿里P8架构师的解析:最新Java性能测试、调优策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写第一个Java程序:hellowor
- 下一篇: 依赖注入的三种方式_Java核心知识 S