摘要:應用性能優化是一個程序員必須要考慮的問題,典型的性能問題如頁面響應慢接口超時,服務器負載高并發數低,數據庫頻繁死鎖等。診斷對于主要關注平均負載,使用率,上下文切換次數。應用診斷及工具應用代碼性能問題是相對好解決的一類性能問題。
Java 應用性能優化是一個程序員必須要考慮的問題,典型的性能問題如頁面響應慢、接口超時,服務器負載高、并發數低,數據庫頻繁死鎖等。
Java應用性能的瓶頸點非常多,比如磁盤、內存、網絡 I/O 等系統因素,Java 應用代碼,JVM GC,數據庫,緩存等??梢詫?Java 性能優化分為 4 個層級:應用層、數據庫層、框架層、JVM 層,如圖 1 所示。
圖 1.Java 性能優化分層模型
每層優化難度逐級增加,涉及的知識和解決的問題也會不同。比如應用層需要理解代碼邏輯,通過 Java 線程棧定位有問題代碼行等;數據庫層面需要分析 SQL、定位死鎖等;框架層需要懂源代碼,理解框架機制;JVM 層需要對 GC 的類型和工作機制有深入了解,對各種 JVM 參數作用了然于胸。
1 CPU 診斷
對于 CPU 主要關注平均負載(Load Average),CPU 使用率,上下文切換次數(Context Switch)。
通過 top 命令可以查看系統平均負載和 CPU 使用率,圖 2 為通過 top 命令查看某系統的狀態。
圖 2.top 命令示例
平均負載有三個數字:63.66,58.39,57.18,分別表示過去 1 分鐘、5 分鐘、15 分鐘機器的負載。按照經驗,若數值小于 0.7*CPU 個數,則系統工作正常;若超過這個值,甚至達到 CPU 核數的四五倍,則系統的負載就明顯偏高。
圖 2 中 15 分鐘負載已經高達 57.18,1 分鐘負載是 63.66(系統為 16 核),說明系統出現負載問題,且存在進一步升高趨勢,需要定位具體原因了。
通過 vmstat 命令可以查看 CPU 的上下文切換次數:
上下文切換次數發生的場景主要有如下幾種:
? 1)時間片用完,CPU 正常調度下一個任務;
? 2)被其它優先級更高的任務搶占;
? 3)執行任務碰到 I/O 阻塞,掛起當前任務,切換到下一個任務;
? 4)用戶代碼主動掛起當前任務讓出 CPU;
? 5)多任務搶占資源,由于沒有搶到被掛起;
? 6)硬件中斷。
Java 線程上下文切換主要來自共享資源的競爭。一般單個對象加鎖很少成為系統瓶頸,除非鎖粒度過大。但在一個訪問頻度高,對多個對象連續加鎖的代碼塊中就可能出現大量上下文切換,成為系統瓶頸。
比如在我們系統中就曾出現 log4j 1.x 在較大并發下大量打印日志,出現頻繁上下文切換,大量線程阻塞,導致系統吞吐量大降的情況,其相關代碼如清單 1 所示,升級到 log4j 2.x 才解決這個問題。
2 Memory
從操作系統角度,內存關注應用進程是否足夠,可以使用 free –m 命令查看內存的使用情況。
通過 top 命令可以查看進程使用的虛擬內存 VIRT 和物理內存 RES,根據公式 VIRT = SWAP + RES 可以推算出具體應用使用的交換分區(Swap)情況,使用交換分區過大會影響 Java 應用性能,可以將 swappiness 值調到盡可能小。
因為對于 Java 應用來說,占用太多交換分區可能會影響性能,畢竟磁盤性能比內存慢太多。
3 I/O
I/O 包括磁盤 I/O 和網絡 I/O,一般情況下磁盤更容易出現 I/O 瓶頸。通過 iostat 可以查看磁盤的讀寫情況,通過 CPU 的 I/O wait 可以看出磁盤 I/O 是否正常。
如果磁盤 I/O 一直處于很高的狀態,說明磁盤太慢或故障,成為了性能瓶頸,需要進行應用優化或者磁盤更換。
4 Java 應用診斷及工具
應用代碼性能問題是相對好解決的一類性能問題。通過一些應用層面監控報警(UMP),如果確定有問題的功能和代碼,直接通過代碼就可以定位;或者通過 top+jstack,找出有問題的線程棧,定位到問題線程的代碼上,也可以發現問題。對于更復雜,邏輯更多的代碼段,通過 Stopwatch 打印性能日志往往也可以定位大多數應用代碼性能問題。
常用的 Java 應用診斷包括線程、堆棧、GC 等方面的診斷。
jstack
jstack 命令通常配合 top 使用,通過 top -H -p pid 定位 Java 進程和線程,再利用 jstack -l pid 導出線程棧。由于線程棧是瞬態的,因此需要多次 dump,一般 3 次 dump,一般每次隔 5s 就行。將 top 定位的 Java 線程 pid 轉成 16 進制,得到 Java 線程棧中的 nid,可以找到對應的問題線程棧。
JProfiler
JProfiler 可對 CPU、堆、內存進行分析,功能強大.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75615.html
摘要:在本文中我將會介紹應用性能優化的一般原則。性能優化的流程圖摘取自和合著的性能,描述了應用性能優化的處理流程。例如,對每臺服務器,你面臨著為單個分配堆內存和運行個并為每個分配堆內存的選擇。不過位能使用堆內存最大理論值只有。 原文鏈接:http://www.cubrid.org/blog/dev-platform/the-principles-of-java-application-per...
摘要:高性能代碼的最佳實踐前言在這篇文章中,我們將討論幾個有助于提升應用程序性能的方法。要獲得有關應用程序需求的最好最可靠的方法是對應用程序執行實際的負載測試,并在運行時跟蹤性能指標。 showImg(https://segmentfault.com/img/bVbtgk4?w=256&h=254); 高性能Java代碼的最佳實踐前言 在這篇文章中,我們將討論幾個有助于提升Java應用程序性...
摘要:能夠讓的周期利用的更充分對于多線程應用運行在多處理器和多核系統上至很有挑戰性的。另外,當達到飽和狀態的時候并不能說明的性能和伸縮性已經達到了最佳的狀態。磁盤如果應用有對磁盤進行操作,我們需要對磁盤進行監控,來監測可能出現的磁盤性能問題。 對于 Java 性能比較關心的同學大概都知道《Java Performance》這本書,一般而言,很多同學在日常寫 Java Code 的時候很少去關...
摘要:昨天有個小學弟給我發來微信,說他現在有點后悔選擇開發了,月月光不說,還加班特別嚴重,平時也沒有屬于自己的時間去學習,問我剛畢業的時候是不是這樣。每天回到出租屋都是倒頭就睡,非常累,也沒有其他時間提升自己的技術。 昨天有個小學弟給我發來微信,說他現在有點后悔選擇Android開發了,月月光不說...
摘要:甲骨文對于是一個完整的解決方案,包括高性能的虛擬機,分析,監測和診斷工具,可用于在應用程序的延遲預測。它也可以被用作一個運行時性能分析工具,稱為運行時分析器,還可以分析內存問題。是一個堆分析器,可以幫助你發現內存泄漏和減少內存消耗。 1、NetBeans profiler NetBeans Profiler是一個模塊化的添加,為NetBeans IDE提供分析功能,它是一個開源的集成開...
閱讀 1582·2021-09-02 15:41
閱讀 992·2021-09-02 15:11
閱讀 1274·2021-07-28 00:15
閱讀 2296·2019-08-30 15:55
閱讀 1136·2019-08-30 15:54
閱讀 1685·2019-08-30 15:54
閱讀 2966·2019-08-30 14:02
閱讀 2516·2019-08-29 16:57