首頁 Java java教程 打造高性能Java應用程式需掌握的5大知識

打造高性能Java應用程式需掌握的5大知識

Nov 30, 2016 am 11:24 AM
java

這篇文章節選自《java performance》,對java性能比較關心的同學大概都知道這本書,性能這個東西可能是很多同學在日常寫java code的時候很少去關心的,但是在我們寫code的過程中確又時時離不開對程式效能的影響,小到我們使用位元運算來實現算術運算,大到我們對JAVA程式碼的整體架構設計,效能其實離我們很近。本片文章主要提到幾個點,主要是在性能領域我們比較關注的一些問題,並且是有啟發性的,如果同學對性能較感興趣,那麼我們可以一起深入研究各個點。

對於效能調優,通常會有三個步驟:1,效能監控;2,效能剖析;3,效能調優

我們對於作業系統的效能關注主要在下面幾個點:CPU利用率、CPU調度執行佇列、記憶體使用率、網路I/O、磁碟I/O。

1.CPU利用率

對於一個應用來說,為了讓應用達到最好的性能和可擴展性,我們不僅僅要充分利用CPU週期內可用的部分,而且要讓這部分CPU的使用更有價值,而不是浪費。能夠讓CPU的周期利用的更充分對於多執行緒應用運行在多處理器和多核心系統上至很有挑戰性的。另外,當CPU達到飽和狀態的時候並不能說明CPU的效能和伸縮性已經達到了最佳的狀態。為了區分應用程式是如何利用CPU資源的,我們必須從作業系統層級來偵測。在許多作業系統上,CPU的使用率統計報告通常包括使用者和系統或核心對作業系統的使用。使用者對CPU的使用是指應用程式用來執行應用程式程式碼執行所需的時間。相較之下,核心和系統對CPU的使用是指應用程式用來執行作業系統核心程式碼鎖所花費的時間。高的核心或系統CPU使用率可以表示共享資源緊迫,或是有大量的I/O裝置互動。理想的狀態為了提高應用的效能和伸縮性,讓核心或系統CPU時間為0%,因為花在執行核心或系統程式碼的時間是可以用來執行應用程式碼的。因此CPU使用最佳化的一個正確方向就是盡可能減少CPU花在執行核心程式碼或系統程式碼的時間。

對於計算密集型應用,效能監控比監測用戶CPU使用和核心或系統CPU使用要更深層次,在計算密集型應用中,我們需要監測CPU時鐘週期內的執行執行條數(Instructions per clock;IPC )或是每個CPU執行所使用的CPU週期(cycles per instruction;CPI)。對於運算密集型應用來說我們從這兩個維度來監測CPU是不錯的選擇,因為現代作業系統的打包CPU效能報告工具通常只會列印CPU的利用率,而不會列印CPU週期內CPU用來執行指令的時間。這意味著當CPU正在等待記憶體中的資料的時候,作業系統CPU效能報告工具也會認為CPU是正在使用的狀態,我們把這個場景叫做“Stall”,“Stall”場景經常會發生,例如在CPU正在執行指令的任何時候,只要是指令需要的資料沒有準備好,也就是沒有在暫存器或CPU快取內,都會發生「Stall」場景。

當「Stall」場景發生的時候CPU會浪費時脈週期,因為CPU必須要等待指令需要的資料到達暫存器或緩衝器。而且在這個場景中,數百個CPU時鐘週期被浪費是很正常的事情,因此在計算密集型應用中,提高性能的策略是減少“Stall”場景的發生或者是增強CPU的緩存使用從而使得更少的CPU週期因為等待資料而浪費掉。這類的效能監控知識已經超越了本書的內容,需要效能專家的幫助了。然而,後面講到的Oracle Solaris Studio Performance Analyzer這種效能剖析工具將會包含此類資料。

2.CPU調度佇列

除了CPU使用的監控,我們也可以透過監控CPU執行佇列來檢查系統是否已經滿載。執行佇列是用來儲存輕量級進程,這些進程通常是已經準備好執行了但是正在等待CPU調度而在調度隊列等待的一種狀態,當輕量級進程別當前處理器能來得及處理的數量更多的時候,調度隊列將會產生。比較深的CPU調度佇列表示系統已經滿載了。系統的執行佇列深度等於虛擬處理器執行不了的等待數,虛擬處理器數等於系統的硬體執行緒數。我們可以用java的api來拿到虛擬處理器數,Runtime.avaliableProcessors()。當執行佇列深度大於虛擬處理器個數的四倍或更多的時候,作業系統將會出現反應遲鈍的現象。

對於CPU調度隊列的檢測的一個通用指導是當我們發現隊列深度高於虛擬進程數一倍的時候就要注意了,但是沒有必要立即採取行動。當大於三倍或四倍或更高的時候就要注意了,解決問題刻不容緩。

通常有兩個可選的途徑來觀察隊列的深度,第一個是透過增加CPU來分擔負載或減少對現有CPU的負載。這種途徑從本質上減少了每個執行單元的負載執行緒數,從而減少執行執行佇列的深度。

另外的一種途徑是透過剖析系統運作的應用來增加CPU的使用率,換個說法就是尋找一種可以減少花費在垃圾回收上的CPU週期,或者尋找更好的演算法來以更少的CPU週期來執行CPU指令。效能專家通常專注於後面的一種途徑:減少程式碼的執行路徑長度和更好的CPU指令選擇。 JAVA程式設計師可以透過更好的執行演算法和資料結構來提高程式碼的執行效率。

3.記憶體利用率

除了CPU的使用率,系統的記憶體屬性也需要被監控,這些屬性包括例如:分頁、交換、鎖、多執行緒造成的上下文交換等。

交換通常發生在當應用程式需要的記憶體大於實際的實體記憶體的時候,處理這種情況作業系統通常會配置一個對應的區域叫做交換區。交換區通常位於實體磁碟上,當實體記憶體內應用耗盡的時候,作業系統會將一部分記憶體資料暫時交換到磁碟空間上,這部分記憶體區域通常是存取頻率最低的區域,而不會影響比較「忙」的記憶體區域;當被交換到磁碟區域的記憶體又被應用存取的時候,這個時候就需要從磁碟交換區將以頁為單位讀入內存,交換會影響應用程式的效能。

虛擬機的垃圾收集器在交換的時候性能非常差,因為垃圾收集器所訪問的大部分區域都是不可達的,也就是垃圾收集器會引起交換活動的發生。場景是戲劇性的,如果垃圾收集的堆區域已經被交換到了磁碟空間,這個時候將會以頁為單位發生交換,這樣才能夠被垃圾收集器所掃描到,在交換的過程中會戲劇性的引發垃圾收集器的收集時間延長,這個時候如果垃圾收集器是「Stop The World」(使得應用回應停止)的,那麼這個時間就會被延長。

4.網路I/O

分散式JAVA應用的效能和伸縮性會受到網路頻寬和網路效能的限制。例如,如果我們往網路介面發送比他能夠處理的更多的資料包,資料包將會堆積在作業系統的緩衝區內,這將會引發應用延遲,另外其他的情況也會導致網路應用的延遲。

區分和監控的工具通常在作業系統的打包工具中很難找到。儘管linux提供了netstat指令,linux和solaris都提供了網路使用情況的實現,他們都提供了包括每秒發包、接包、錯包、衝突等資訊的統計。在乙太網路中,一小部分包衝突是很正常的現象。如果錯包情況比較多那可能是網路卡有問題了。同時,儘管netstat可以統計網路介面的發送和接收資料情況,這很難斷定網路卡是否被充分利用。例如,如果netstat -i顯示現在每秒有2500個包從網卡發出,但是我們仍然無法判斷當前的網路利用率是100%還是1%,我們僅僅能夠知道目前有流量。這只是在不知道網路包大小的情況下能夠得到的結論。簡單的說我們無法透過linux和solaris提供的netstat來判斷目前網路是否影響了效能。我們需要一些其他的工具在我們的JAVA應用運作的過程中來監測網路。

5.磁碟I/O

如果應用有對磁碟進行操作,我們需要對磁碟進行監控,來監測可能出現的磁碟效能問題。有些應用是I/O密集型的,例如資料庫。磁碟的使用通常也存在於應用日誌系統,日誌通常是我們用來記錄系統運作過程中重要資訊的。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP:許多網站的基礎 PHP:許多網站的基礎 Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP與Python:用例和應用程序 PHP與Python:用例和應用程序 Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

See all articles