精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

看一下Java性能優化都有哪些可以遵循的規律

Android編程精選 ? 來源:CSDN ? 作者:農民工老王 ? 2022-10-09 16:10 ? 次閱讀

本文主要側重于理論分析,我們從整體上看一下 Java 性能優化都有哪些可以遵循的規律。本文主講理論。關于實踐,后續的文章會用較多的案例來細化本文的知識點,適合反復思考和歸納。

Part1概述

性能優化根據優化的類別,分為業務優化和技術優化。業務優化產生的效果也是非常大的,但它屬于產品和管理的范疇。同作為程序員,在平常工作中,我們面對的優化方式,主要是通過一系列的技術手段,來完成對既定的優化目標。這一系列的技術手段,我大體歸納為如圖以下 7 類:

poYBAGNCgieAanFEAAB-mdCDfUU894.jpg
可以看到,優化方式集中在對計算資源和存儲資源的規劃上。優化方法中有多種用空間換時間的方式,但只照顧計算速度,而不考慮復雜性和空間問題,也是不可取的。我們要做的,就是在照顧性能的前提下,達到資源利用的最優狀態。

接下來,我簡要介紹一下這7個優化方向。如果你感覺比較枯燥,那也沒關系,我們本文的目的,就是讓你的腦海里有一個總分的概念,以及對理論基礎有一個整體的認識。

Part2復用優化

在寫代碼的時候,你會發現有很多重復的代碼可以提取出來,做成公共的方法。這樣,在下次用的時候,就不用再費勁寫一遍了。

這種思想就是復用。上面的描述是編碼邏輯上的優化,對于數據存取來說,有同樣的復用情況。無論是在生活中還是編碼中,重復的事情一直在發生,如果沒有復用,工作和生活就會比較累。

在軟件系統中,談到數據復用,我們首先想到的就是緩沖和緩存。注意這兩個詞的區別,它們的意義是完全不同的,很多同學很容易搞混,在這里簡單地介紹一下。

緩沖(Buffer),常見于對數據的暫存,然后批量傳輸或者寫入。多使用順序方式,用來緩解不同設備之間頻繁地、緩慢地隨機寫,緩沖主要針對的是寫操作。

緩存(Cache),常見于對已讀取數據的復用,通過將它們緩存在相對高速的區域,緩存主要針對的是讀操作。

與之類似的,是對于對象的池化操作,比如數據庫連接池、線程池等,在 Java 中使用得非常頻繁。由于這些對象的創建和銷毀成本都比較大,我們在使用之后,也會將這部分對象暫時存儲,下次用的時候,就不用再走一遍耗時的初始化操作了。

Part3計算優化

并行執行

現在的 CPU 發展速度很快,絕大多數硬件,都是多核。要想加快某個任務的執行,最快最優的解決方式,就是讓它并行執行。并行執行有以下三種模式。

第一種模式是多機,采用負載均衡的方式,將流量或者大的計算拆分成多個部分,同時進行處理。比如,Hadoop 通過 MapReduce 的方式,把任務打散,多機同時進行計算。

第二種模式是采用多進程。比如 Nginx,采用 NIO 編程模型,Master 統一管理 Worker 進程,然后由 Worker 進程進行真正的請求代理,這也能很好地利用硬件的多個 CPU。

第三種模式是使用多線程,這也是 Java 程序員接觸最多的。比如 Netty,采用 Reactor 編程模型,同樣使用 NIO,但它是基于線程的。Boss 線程用來接收請求,然后調度給相應的 Worker 線程進行真正的業務計算。

像 Golang 這樣的語言,有更加輕量級的協程(Coroutine),協程是一種比線程更加輕量級的存在,但目前在 Java 中還不太成熟,就不做過多介紹了,但本質上,它也是對于多核的應用,使得任務并行執行。

變同步為異步

再一種對于計算的優化,就是變同步為異步,這通常涉及編程模型的改變。同步方式,請求會一直阻塞,直到有成功,或者失敗結果的返回。雖然它的編程模型簡單,但應對突發的、時間段傾斜的流量,問題就特別大,請求很容易失敗。

異步操作可以方便地支持橫向擴容,也可以緩解瞬時壓力,使請求變得平滑。同步請求,就像拳頭打在鋼板上;異步請求,就像拳頭打在海綿上。你可以想象一下這個過程,后者肯定是富有彈性的,體驗更加友好。

惰性加載

最后一種,就是使用一些常見的設計模式來優化業務,提高體驗,比如單例模式、代理模式等。舉個例子,在繪制 Swing 窗口的時候,如果要顯示比較多的圖片,就可以先加載一個占位符,然后通過后臺線程慢慢加載所需要的資源,這就可以避免窗口的僵死。

Part4結果集優化

接下來介紹一下對結果集的優化。舉個比較直觀的例子,我們都知道 XML 的表現形式是非常好的,那為什么還有 JSON 呢?除了書寫要簡單一些,一個重要的原因就是它的體積變小了,傳輸效率和解析效率變高了,像 Google 的 Protobuf,體積就更小了一些。雖然可讀性降低,但在一些高并發場景下(如 RPC),能夠顯著提高效率,這是典型的對結果集的優化。

這是由于我們目前的 Web 服務,都是 C/S 模式。數據從服務器傳輸到客戶端,需要分發多份,這個數據量是急劇膨脹的,每減少一小部分存儲,都會有比較大的傳輸性能和成本提升。

像 Nginx,一般都會開啟 GZIP 壓縮,使得傳輸的內容保持緊湊。客戶端只需要一小部分計算能力,就可以方便解壓。由于這個操作是分散的,所以性能損失是固定的。

了解了這個道理,我們就能看到對于結果集優化的一般思路,你要盡量保持返回數據的精簡。一些客戶端不需要的字段,那就在代碼中,或者直接在 SQL 查詢中,就把它去掉。

歡迎關注公眾號"Java學習之道",查看更多干貨!

對于一些對時效性要求不高,但對處理能力有高要求的業務。我們要吸取緩沖區的經驗,盡量減少網絡連接的交互,采用批量處理的方式,增加處理速度。

結果集合很可能會有二次使用,你可能會把它加入緩存中,但依然在速度上有所欠缺。這個時候,就需要對數據集合進行處理優化,采用索引或者 Bitmap 位圖等方式,加快數據訪問速度。

Part5資源沖突優化

我們在平常的開發中,會涉及很多共享資源。這些共享資源,有的是單機的,比如一個 HashMap;有的是外部存儲,比如一個數據庫行;有的是單個資源,比如 Redis 某個 key 的Setnx;有的是多個資源的協調,比如事務、分布式事務等。

現實中的性能問題,和鎖相關的問題是非常多的。大多數我們會想到數據庫的行鎖、表鎖、Java 中的各種鎖等。在更底層,比如 CPU 命令級別的鎖、JVM 指令級別的鎖、操作系統內部鎖等,可以說無處不在。

只有并發,才能產生資源沖突。也就是在同一時刻,只能有一個處理請求能夠獲取到共享資源。解決資源沖突的方式,就是加鎖。再比如事務,在本質上也是一種鎖。

按照鎖級別,鎖可分為樂觀鎖和悲觀鎖,樂觀鎖在效率上肯定是更高一些;按照鎖類型,鎖又分為公平鎖和非公平鎖,在對任務的調度上,有一些細微的差別。

對資源的爭用,會造成嚴重的性能問題,所以會有一些針對無鎖隊列之類的研究,對性能的提升也是巨大的。

Part6算法優化

算法能夠顯著提高復雜業務的性能,但在實際的業務中,往往都是變種。由于存儲越來越便宜,在一些 CPU 非常緊張的業務中,往往采用空間換取時間的方式,來加快處理速度。

算法屬于代碼調優,代碼調優涉及很多編碼技巧,需要使用者對所使用語言的 API 也非常熟悉。有時候,對算法、數據結構的靈活使用,也是代碼優化的一個重要內容。比如,常用的降低時間復雜度的方式,就有遞歸、二分、排序、動態規劃等。

一個優秀的實現,比一個拙劣的實現,對系統的影響是非常大的。比如,作為 List 的實現,LinkedList 和 ArrayList 在隨機訪問的性能上,差了好幾個數量級;又比如,CopyOnWriteList 采用寫時復制的方式,可以顯著降低讀多寫少場景下的鎖沖突。而什么時候使用同步,什么時候是線程安全的,也對我們的編碼能力有較高的要求。

這部分的知識,就需要我們在平常的工作中注意積累。

高效實現在平時的編程中,盡量使用一些設計理念良好、性能優越的組件。比如,有了 Netty,就不用再選擇比較老的 Mina 組件。而在設計系統時,從性能因素考慮,就不要選 SOAP 這樣比較耗時的協議。再比如,一個好的語法分析器(比如使用 JavaCC),其效率會比正則表達式高很多。

總之,如果通過測試分析,找到了系統的瓶頸點,就要把關鍵的組件,使用更加高效的組件進行替換。在這種情況下,適配器模式是非常重要的。這也是為什么很多公司喜歡在現有的組件之上,再抽象一層自己的;而當在底層組件進行切換的時候,上層的應用并無感知。

Part7JVM 優化

因為 Java 是運行在 JVM 虛擬機之上,它的諸多特性,就要受到 JVM 的制約。對 JVM 虛擬機進行優化,也能在一定程度上能夠提升 JAVA 程序的性能。如果參數配置不當,甚至會造成 OOM 等比較嚴重的后果。

目前被廣泛使用的垃圾回收器是 G1,通過很少的參數配置,內存即可高效回收。CMS 垃圾回收器已經在 Java 14 中被移除,由于它的 GC 時間不可控,有條件應該盡量避免使用。

JVM 性能調優涉及方方面面的取舍,往往是牽一發而動全身,需要全盤考慮各方面的影響。所以了解 JVM 內部的一些運行原理,還是特別重要的,它有益于我們加深對代碼更深層次的理解,幫助我們書寫出更高效的代碼。

Part8小結

以上就是代碼優化的 7 個大方向,我們通過簡要的介紹,讓大家對性能優化的內容有了大體的了解。這7大方向是代碼優化的最主要方向,當然,性能優化還包含數據庫優化、操作系統優化、架構優化等其他一些內容,這些不是我們的重點。

本文時適合案例分析后回讀,更加能夠加深你對 Java 性能優化的理解。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2957

    瀏覽量

    104544
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11512

原文標題:Java性能優化的七個方向

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    看一下射頻電路中的那些無源器件

    今天我們一起來看一下射頻電路中的那些無源器件。和數字和低頻電路類似,射頻電路也分為無源器件和有源器件
    發表于 10-08 16:03 ?702次閱讀
    <b class='flag-5'>看一下</b>射頻電路中的那些無源器件

    哪位大神幫忙看一下

    `我的keil用不了,幫我看一下,怎么解決啊`
    發表于 04-13 21:32

    請幫忙看一下

    請幫看一下這個圖有問題嗎,改成這樣可以
    發表于 12-16 19:37

    麻煩哪位大神幫忙看一下這塊microsemi ProASIC3 Starter Kit的板子都有些啥東西

    本帖最后由 黑夜白羊 于 2016-10-19 19:26 編輯 新手剛開始學FPGA,老師給推薦的這塊板子,先讓我看一下這塊板子都有沒有緩沖存儲器,ROM,RAM之類的東西再決定買不買,麻煩哪位大神幫忙看一下
    發表于 10-19 19:12

    大家看一下這個是什么元件

    這是個升壓模塊里邊的,由于被商家把型號抹掉了也不知道是什么?哪個老師看一下是什么?假設上邊的角是1 左下角是2 右下角是3得出的數據我已經寫在紙上了,字丑希望可以看懂
    發表于 11-27 23:27

    哪位大神可以幫我看一下這塊板子?

    新人剛上手,調試了好段時間,直不出圖像,這就是VGA轉HDMI的板子,還有塊對接搞定了,這個側板實在是弄不出來了。有沒有人可以幫我看一下
    發表于 10-26 15:17

    詳解java代碼優化方法

    的,還能在定程度上避免未知錯誤,常用的Java代碼優化細節如下:1. 為類、方法指定final修飾符為類指定final修飾符可以讓類不可以
    發表于 04-02 15:43

    485 modbus優化問題 請求幫忙看一下 謝謝

    請問我單臺表正常讀數會出現停頓現象 如果我加個for循環讀取會延遲讀取時間 而不能秒讀取個請大神幫我看一下怎么優化 謝謝
    發表于 10-18 14:28

    針對于Java的35 個代碼性能優化總結

    針對于Java的35 個代碼性能優化總結 前言代碼優化個很重要的課題。可能有些人覺得沒用,
    發表于 06-19 21:03

    嵌入式Java虛擬機的性能優化技術

    ——JMO+(JMOplus)的性能優化技術。 在過去的幾年里,Java已經在各個領域得到了廣泛的應用,尤其是無線移動領域,全球180多個移動運營商已經推出了Java下載服務。無線手持
    發表于 07-18 06:26

    關于java性能優化些細節

    ,但是,吃的小蝦米多之后,鯨魚就被喂飽了。代碼優化也是樣,如果項目著眼于盡快無BUG上線,那么此時可以抓大放小,代碼的細節可以不精打細磨
    發表于 10-11 09:23

    燃氣熱水器安全問題,使用應遵循一定規律

    燃氣熱水器安全問題,使用應遵循一定規律 燃氣熱水器和許多產品樣,使用應遵循定的規律,只要按
    發表于 02-21 15:35 ?1106次閱讀

    看一下SMART高速計數向導的應用

    SMART不僅支持利用指令編寫高速計數程序的功能,還提供了便捷的高速計數向導功能,只需要簡單組態就可以自動生成程序,而且程序未進行加密,生成后可以修改。下面一起來看一下向導如何組態吧
    的頭像 發表于 11-20 15:30 ?3369次閱讀

    優化嵌入式軟件時可以遵循幾個通用技巧盤點

    早前的專欄中曾討論過在許多情況需要優化的嵌入式系統的關鍵特征,包括系統時序、代碼大小、RAM使用率和能耗。雖然優化每個特征通常要求不同的方法和技術,但開發人員在優化嵌入式軟件時
    發表于 03-08 14:40 ?657次閱讀

    使用Arthas火焰圖工具的Java應用性能分析和優化經驗

    分享作者在使用Arthas火焰圖工具進行Java應用性能分析和優化的經驗。
    的頭像 發表于 10-28 09:27 ?151次閱讀
    使用Arthas火焰圖工具的<b class='flag-5'>Java</b>應用<b class='flag-5'>性能</b>分析和<b class='flag-5'>優化</b>經驗