終於學完了阿里P8大牛推薦的527頁Java性能優化實踐文檔 首先看目錄 其次,看主要內容

你如何定義性能?

當被問及應用程序的性能時,大部分開發人員會假定他們需要測量某些速度值,比如每秒交易數,或者處理了多少吉字節(GB)數據……,要在儘可能短的時間裏完成大量工作。

如果你是應用程序架構師,那你可能會測量更廣泛的指標。與按直線邏輯執行的程序相比,你或許更關注資源利用率。你可能更重視服務間連接的性能,而不是服務本身的性能。如果你要爲公司做出業務決策,應用程序的性能很多時候不是用時間而是用美元來計算的。你可能會與開發人員和架構師爭論資源分配,權衡 DevOps 的成本和完成公司工作所需要的時間。

有些時候,甚至是大部分時候,“好的”編碼模式盛行:小方法會恰當內聯,接口和類型檢查成本變低,JIT 編譯器生成的原生代碼緊湊又高效。但是其他時候,考慮到編譯器和 CPU 的限制,我們需要手動調整代碼,改變抽象和架構。有些時候,對象幾乎是沒什麼成本的,都不用考慮我們會消耗內存帶寬和垃圾收集週期。其他時候,我們要處理 TB甚至更大規模的數據集,這時候即使是最好的垃圾收集器和內存子系統,也要承受很大壓力。

而現在,性能問題的答案是瞭解你的工具。通常這意味着你不但要了解Java 語言是如何工作的,還要知道 JVM 類庫、內存、編譯器、垃圾收集器和應用程序運行所在的硬件是如何交互的。在我從事 JRuby 項目的工作中,我學到一個有關 JVM 的不變的真理:所有的性能問題都沒有單一的解決方案,而是有很多解決方案。技巧就是找到那些方案,並把最能滿足要求的拼湊起來。

學習如何平衡應用程序的設計和可用的資源,如何監控和調優JVM,如何利用比老舊的類庫和模式更高效的最新 Java 技術,如何讓Java 運行如飛!

對Java開發人員而言,這是一個激動人心的時刻,從來沒有這麼多機會在 Java 平臺上構建高效、響應式的應用程序。讓我們開始吧。

本篇文章將給大家分享Java性能優化實踐:JVM調優策略、工具與技巧,因爲篇幅過多隻能給大家展現出來部分的內容,希望大家能夠理解與喜歡!!

首先看目錄

其次,看主要內容

第1章明確優化與性能;優化 Java 或其他語言代碼的性能經常被視作一種暗黑藝術。性能分析有種神祕感,人們常常將其看作孤獨的黑客在絞盡腦汁、深思熟慮之後練就的手藝。(孤獨的黑客也是好萊塢最喜歡的關於計算機和操作人員的電影橋段之一。)畫面是這樣的:一個人能夠深入瞭解某個系統,提出神奇的解決方案,使計算機運行得更快。

影像中經常夾雜這種不幸但常見的情況:軟件團隊沒那麼重視性能。進而出現的場景是,只有當系統已經陷入麻煩時,團隊纔會加以分析。所以也就需要性能“英雄”來救場了。不過現實情況有點不同。

事實是,性能分析是堅實的經驗主義和軟性的人類心理學的奇異組合。重點在於,一方面是可觀測指標的絕對數字,另一方面是最終用戶和干係人如何看待這些數字。本文其餘部分的主題就是如何解決這一明顯的悖論。

本章首先討論了 Java 的性能是什麼,不是什麼;然後介紹了經驗科學和測量的基本主題,以及一個好的性能實踐將用到的基本詞彙和觀測量;最後介紹了性能測試結果中一些常見的案例。接下來我們將開始討論 JVM 的一些主要內容,併爲理解到底是什麼導致基於 JVM 的性能優化如此複雜做好準備。

第2章JVM概覽;Java 無疑是地球上最大的技術平臺之一,根據 Oracle 的數據,該平臺擁有大約 900 萬到 1000 萬的開發人員。按照設計,很多開發人員不需要了解平臺底層的複雜機制。這就導致一種情況,只有當客戶抱怨性能時,他們纔會遇到這些細節問題。

不過對於關心性能的開發人員而言,理解 JVM 技術棧的基礎非常重要。瞭解 JVM 技術可使開發人員編寫出更好的軟件,併爲調查與性能相關的問題提供必要的理論背景。

本章將介紹 JVM 如何執行 Java,爲後面章節更深入地探索這些主題打下基礎。特別是第 9 章會深入介紹字節碼。讀者可以選擇現在閱讀本章,也可以在理解了其他主題之後結合第 9 章一起重讀。

本章簡要介紹了 JVM 的整體結構。雖然我們只能觸及一些最重要的主題,但事實上,這裏提到的幾乎每個主題背後都有豐富完整的內容,值得進一步研究。

第 3 章將討論操作系統和硬件工作原理的一些細節。這爲 Java 性能分析人員瞭解觀測結果提供了必要的背景。我們還將更詳細地研究計時子系統,它將作爲一個完整的例子來說明虛擬機和原生子系統是如何交互的。

第3章硬件與操作系統;在過去的 20 年裏,處理器設計和現代硬件發生了巨大的變化。在摩爾定律和工程上的限制(特別是內存速度相對較慢)的驅動下,處理器設計的進步已經變得讓人有點難以理解。緩存未命中率已經成爲衡量一個應用程序性能最明顯的領先指標。

在 Java 領域,JVM 的設計允許它使用額外的處理器核心,甚至對於單線程應用程序代碼也是如此。這意味着與其他環境相比,Java 應用程序已經從硬件趨勢中獲得了明顯的性能優勢。

隨着摩爾定律的消逝,人們的注意力再次轉向軟件的相對性能上。注重性能的工程師至少需要了解現代硬件和操作系統的基本要點,以確保他們能夠充分利用硬件,而不是反其道而行之。

下一章將介紹性能測試的核心方法論,並且討論性能測試的主要類型、需要承擔的任務以及性能工作的整個生命週期。我們還將列舉一些在性能分析領域常見的最佳實踐和反模式。

第4章性能測試模式與反模式;性能測試會因不同的原因而進行。本章將介紹團隊可能希望執行的不同類型的測試,並討論每種類型的最佳實踐。

本章的後半部分將概述一些可能會困擾性能測試或團隊的常見反模式,並闡釋如何重構的解決方案,以防止它們成爲團隊的問題。

當評估性能結果時,一定要以恰當的方式處理數據,避免陷入不科學、主觀的思考中。本章介紹了一些測試類型、測試最佳實踐以及性能分析中伴生的反模式。

下一章將研究底層的性能測量手段、微基準測試的陷阱,以及一些用於處理從 JVM 中測得的原始結果的統計技術。

第5章微基準測試與統計;本章將考慮直接測量 Java 性能數字的具體細節。JVM 的動態特性意味着性能數字往往比許多開發人員預期的要更難處理。因此,互聯網上出現了許多不準確或帶有誤導性的性能數字。

本章的一個主要目標是確保你意識到這些可能的陷阱,並且只生成你和其他人可以信賴的性能數字。特別需要注意的是,對小塊 Java 代碼的測量(微基準測試)非常微妙且難以正確完成,這也是本章將要探究的主要內容,同時我們還會介紹性能工程師應該如何正確使用它。

第6章理解垃圾收集;自平臺誕生以來,垃圾收集一直是 Java 社區內討論的熱門話題。本章介紹了性能工程師需要了解的關鍵概念,以便有效地與 JVM 的垃圾收集子系統一起工作。這些概念包括:

  • 標記和清除收集;
  • 對象在 HotSpot 內部的運行時表示;
  • 弱分代假說;
  • HotSpot 的內存子系統實例;
  • 並行收集器;
  • 分配及其核心作用。

下一章將討論垃圾收集的調優、監控和分析。有些主題在本章已經出現過,特別是分配,以及過早晉升等特殊效應,這些內容對於接下來的目標和主題也特別重要,經常回來參考本章可能會很有幫助。

第7章垃圾收集高級話題;上一章介紹了 Java 垃圾收集的基本理論。以此爲起點,本章將進一步研究現代 Java 垃圾收集器的理論。這個領域有很多不可避免的權衡可以指導工程師如何選擇收集器。

首先,本章將介紹並深入瞭解 HotSpot JVM 提供的其他收集器,其中包括停頓時間超短、通常爲併發的收集器(CMS)和現代通用收集器(G1)。

此外,還將考慮一些比較少見的收集器,包括:

  • Shenandoah
  • C4
  • 均衡(balanced)收集器
  • 遺留的 HotSpot 收集器

並非所有這些收集器都在 HotSpot 虛擬機中使用,我們還將討論另外兩個虛擬機的收集器: IBM J9(IBM 的一款 JVM,之前是閉源的,目前正在逐步開源)和 Azul Zing(一款專有的 JVM),我們在 2.6 節曾介紹過。

第8章垃圾收集日誌、監控、調優及工具;本章介紹了垃圾收集調優藝術的一些皮毛。這裏演示的技術大多是針對個別收集器的,但也有一些普遍適用的基本技術。本章還介紹了一些處理垃圾收集日誌的基本原則以及一些有用的工具。

下一章將討論 JVM 的另一個主要子系統:應用程序代碼的執行。我們首先將概述解釋器,然後在此基礎上開始討論 JIT 編譯,包括它與標準編譯(或者說 AOT 編譯)的關係。

第9章JVM上的代碼執行;JVM 的初始代碼執行環境是字節碼解釋器。本章探討了解釋器的基礎知識,因爲要正確理解 JVM 的代碼執行,掌握字節碼如何工作的知識是必不可少的。此外,我們還介紹了 JIT 編譯的基本理論。

然而,對於大多數性能工作而言,JIT 編譯的代碼的行爲遠比解釋器的任何方面重要。下一章將在本章介紹的基礎上,深入研究 JIT 編譯的理論與實踐。

對於許多應用程序而言,本章所演示的針對代碼緩存的簡單調優技術已經足夠了。但對於那些對性能特別敏感的應用程序來說,可能還需要對JIT 行爲進行更深入地探索。下一章將介紹一些對要求更嚴格的應用程序進行調優的工具和技術。

第10章理解即時編譯;本章將深入介紹 JVM 中 JIT 編譯器的內部工作方式。大部分內容直接適用於 HotSpot,不過並不保證和其他 JVM 實現一致。

我們曾經提到過,與 JIT 編譯相關的科學研究已經相當深入,不只是JVM,很多現代編程環境也用到了 JIT。因此,很多 JIT 技術也適用於其他 JIT 編譯器。

因爲這個主題非常抽象,而且技術上也很複雜,所以需要一些工具來幫我們理解 JVM 的內部工作方式,並將其以可視化方式表現出來。本章將使用的主要工具是 JITWatch,我們會先加以介紹。之後會解釋具體的JIT 優化和特性,並演示如何通過 JITWatch 觀察該技術及其效果。

第11章Java語言性能技術;本章討論了標準 Java 集合 API 的一些性能問題,以及處理領域對象的關鍵關注點。

最後我們探討了另外兩個與平臺級別關係密切的應用程序性能方面的考慮:終結化和方法句柄。雖然很多開發人員在日常工作中並不會遇到這兩個概念,但對於關注性能的工程師來說,瞭解和認識它們可以充實自己的技術工具箱。

下一章將繼續討論幾個重要的開源庫,包括那些爲標準集合類提供替代選擇的庫,以及日誌和相關問題。

第12章併發性能技術;在迄今爲止的計算曆史上,軟件開發人員通常以順序格式編寫代碼。程序設計語言和硬件一般只提供一次處理指令的能力。許多情況下,人們享受到了所謂的“免費午餐”就是購買最新的硬件來提高應用程序的性能。芯片上可用的晶體管數量的增加帶來了處理指令性能更好、更強的處理器。

許多讀者都曾遇見過這樣的情況:將軟件搬到一個更大或更新的機器上就能解決容量問題,而不用花錢去查找底層問題或考慮不同的編程範式。

對於希望使用多線程來改進應用程序性能之前應該考慮哪些主題,本章只觸及了一些表面內容。在將單線程應用程序轉變爲併發設計的時候,應該:

  • 確保能夠準確測量線性處理的性能;
  • 應用一個變化,並測試性能是否真的得到了提高;
  • 確保性能測試易於重新運行,特別是當系統處理的數據大小可能發生變化時。

第13章剖析;在程序員羣體中,剖析(profiling)這個術語的使用並不是非常統一。事實上,可能的剖析方法有很多種,其中最常見的有以下兩種:

  • 執行
  • 分配

本章將涵蓋這兩個主題。首先重點關注執行剖析,我們會藉着這個主題來介紹可用於剖析程序的工具。之後會介紹內存剖析,看一看各種工具是如何提供這種能力的。

我們將探討對於 Java 開發人員和性能工程師而言,瞭解剖析器的一般操作方式是多麼重要。因爲剖析器有可能扭曲應用程序的行爲,並表現出明顯的偏差。

執行剖析是性能剖析的領域之一,在這個領域中,這些偏差就會凸顯出來。謹慎的性能工程師會意識到這種可能性,並通過各種方式來彌補,包括使用多種工具進行剖析,以瞭解真正發生的情況。

對於性能工程師而言,同樣重要的是要解決自己的認知偏差,不要致力於挖掘符合自己預期的性能行爲。在第 4 章中遇到的反模式和認知陷阱就是我們訓練自己避免這些問題的一個很好的開始。

第14章高性能日誌和消息系統;日誌記錄是所有生產級應用程序中不可或缺的一部分,所使用的日誌記錄器的類型對整體的應用程序性能有非常大的影響。當涉及日誌記錄時,重要的是要將應用程序當作一個整體而不只是執行日誌記錄語句來考慮,同時注意它對其他 JVM 子系統(如線程使用和垃圾收集)的影響。

本章包含一些低延遲庫的簡單例子,從最底層開始,一直到一個完整的消息系統實現。顯然,應該把低延遲系統的目的和目標應用於整個軟件棧,從最底層的隊列一直到更高層次的應用。低延遲、高吞吐量的系統需要大量的思考、經驗和控制,這裏討論的許多開源項目是基於大量豐富的經驗構建起來的。如果你需要創建一個新的低延遲系統,只要能從底層設計目標一直堅持到頂層應用程序,這些項目都將爲你節省幾天甚至幾周的開發時間。

本章開始提出的一個問題是 Java 和 JVM 可以在多大程度上應用於高吞吐量的應用程序。使用任何語言編寫低延遲、高吞吐量的應用程序都是非常困難的,但是在所有可用的語言中,Java 提供了最好的工具和生產效率。此外,Java 和 JVM 確實增加了另一個抽象層次,我們需要對其進行管理,並在某些情況下加以規避。同時,考慮硬件、JVM 性能和更底層的問題也非常重要。

我們在日常的 Java 開發工作中一般不會遇到這些較爲底層的問題。使用本章所討論的較新的免分配的日誌庫、數據結構和消息傳遞協議,可以大大降低進入門檻,因爲很多複雜的問題已經被開源社區解決了。

第15章Java9以及Java的未來方向;自第一個版本發佈以來,Java 已經發生了很大的變化,即從一開始並沒有被明確設計爲一種高性能語言,到現在已經成爲這樣的語言。即使Java 已擴展到很多新應用領域,但是核心的 Java 平臺、社區和生態系統仍然保持着健康和活力。

像 Project Metropolis 和 Graal 等大膽的新舉措,正在重新塑造核心虛擬機。invokedynamic 也讓 Java 走出了其演進的舒適區,爲下一個十年重新改造自己。Java 已經表明它不怕進行大膽的更改,比如增加值類型以及重新解決泛型存在的複雜問題。

Java/JVM 性能是一個非常有活力的領域,本章中我們看到了性能在很多領域中仍在取得進步。還有很多其他的項目我們沒有時間提及,包括Java/ 原生代碼交互(project panama)和新的垃圾收集器(如 Oracle 的ZGC)。

因此,本文所講的內容並不全面,因爲性能工程師還有很多東西需要了解。儘管如此,我們還是希望它能夠對讀者理解 Java 性能世界有所幫助,也爲讀者的性能之旅提供一些路標。

需要這份527頁【Java性能優化實踐:JVM調優策略、工具與技巧】文檔的小夥伴,可以轉發此文關注小編

**需要的朋友麻煩幫忙點贊一下文章,+小助理V X: bjmashibing001  免費領取!**

希望能幫助到大家的學習,努力成就更好的自己!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章