📫作者簡介:小明java問道之路,2022年度博客之星全國TOP3,專注于后端、中間件、計算機底層、架構設計演進與穩定性建設優化,文章內容兼具廣度、深度、大廠技術方案,對待技術喜歡推理加驗證,就職于知名金融公司后端高級工程師。
? ? ? ??
📫 熱衷分享,喜歡原創~ 關注我會給你帶來一些不一樣的認知和成長。
? ? ? ??
🏆 2022博客之星TOP3 | CSDN博客專家 | 后端領域優質創作者 | CSDN內容合伙人
🏆 InfoQ(極客邦)簽約作者、阿里云專家 | 簽約博主、51CTO專家 | TOP紅人、華為云享專家
????????
🔥如果此文還不錯的話,還請👍關注、點贊、收藏三連支持👍一下博主~?
🍅 文末獲取聯系 🍅??👇🏻 精彩專欄推薦訂閱收藏 👇🏻
專欄系列(點擊解鎖)
學習路線(點擊解鎖)
知識定位
🔥Redis從入門到精通與實戰🔥
Redis從入門到精通與實戰
圍繞原理源碼講解Redis面試知識點與實戰
🔥MySQL從入門到精通🔥
MySQL從入門到精通
全面講解MySQL知識與企業級MySQL實戰 🔥計算機底層原理🔥
深入理解計算機系統CSAPP
以深入理解計算機系統為基石,構件計算機體系和計算機思維
Linux內核源碼解析
圍繞Linux內核講解計算機底層原理與并發
🔥數據結構與企業題庫精講🔥
數據結構與企業題庫精講
結合工作經驗深入淺出,適合各層次,筆試面試算法題精講
🔥互聯網架構分析與實戰🔥
企業系統架構分析實踐與落地
行業最前沿視角,專注于技術架構升級路線、架構實踐
互聯網企業防資損實踐
互聯網金融公司的防資損方法論、代碼與實踐
🔥Java全棧白寶書🔥
精通Java8與函數式編程
本專欄以實戰為基礎,逐步深入Java8以及未來的編程模式
深入理解JVM
詳細介紹內存區域、字節碼、方法底層,類加載和GC等知識
深入理解高并發編程
深入Liunx內核、匯編、C++全方位理解并發編程
Spring源碼分析
Spring核心七IOC/AOP等源碼分析
MyBatis源碼分析
MyBatis核心源碼分析
Java核心技術
只講Java核心技術
本文目錄
本文導讀
一、JVM調優
二、常用的JVM調優參數
三、調整堆大小和垃圾回收器
1、調整堆大小
2、調整垃圾回收器
四、使用逃逸分析創建對象
五、JVM友好的代碼?
總結
本文導讀
本文講解JVM調優的步驟、常用的JVM調優參數,如何調整堆大小和垃圾回收器,以及寫出JVM友好的代碼。
一、JVM調優
JVM調優涉及到兩個概念:吞吐量和響應時間。jvm調優主要是針對他們進行調整優化,達到一個理想的目標,根據業務確定目標是吞吐量優先還是響應時間優先。
吞吐量:用戶代碼執行時間/(用戶代碼執行時間+GC執行時間)。
響應時間:整個接口的響應時間(用戶代碼執行時間+GC執行時間),stw時間越短,響應時間越短。?
調優步驟:1、熟悉業務場景,了解當前業務系統的要求,是吞吐量優先還是響應時間優先;2、選擇合適的垃圾回收器組合,如果是吞吐量優先,則選擇ps+po組合;如果是響應時間優先,在1.8以后選擇G1,在1.8之前選擇ParNew+CMS組合;3、大致的規劃內存需求、CPU選擇;4、根據實際情況設置升級年齡(最大年齡為15);5、設定 JVM/GC 參數。
二、常用的JVM調優參數
常用的JVM調優選項包括:
-Xms<size>:設置堆的初始大小。
-Xmx<size>:設置堆的最大大小。-XX:NewSize=<size>:設置年輕代的初始大小。
-XX:MaxNewSize=<size>:設置年輕代的最大大小。
-XX:SurvivorRatio=<ratio>:設置年輕代中Eden區和Survivor區的比例。-XX:PermSize=<size>:設置持久代的初始大小。
-XX:MaxPermSize=<size>:設置持久代的最大大小。-XX:+UseConcMarkSweepGC:使用CMS垃圾回收器。
-XX:+UseParallelGC:使用并行垃圾回收器。
-XX:+UseG1GC:使用G1垃圾回收器。
三、調整堆大小和垃圾回收器
1、調整堆大小
堆大小是JVM在啟動時分配的內存大小。如果堆太小,應用程序可能會發生OutOfMemoryError;如果堆太大,應用程序可能會因為頻繁的垃圾回收而變得緩慢。
// 設置堆的初始大小為512MB,最大大小為1GB
java -Xms512m -Xmx1g// 設置堆的初始大小為1GB,最大大小為2GB
java -Xms1g -Xmx2g// 設置堆的初始大小為2GB,最大大小為4GB
java -Xms2g -Xmx4g
2、調整垃圾回收器
// 使用串行垃圾回收器(單線程,適合于小型應用程序)
java -XX:+UseSerialGC// 使用并行垃圾回收器
// (多線程,適合用于大型/多核CPU的應用程序)
java -XX:+UseParallelGC// 使用并發垃圾回收器
// (多線程,同時允許應用程序繼續運行,適用于需要短暫停頓時間的大型應用程序)
java -XX:+UseConcMarkSweepGC// 使用G1垃圾回收器
// (多線程,將堆分成多個區域可以根據應用程序的實際情況調整垃圾回收的頻率和時間
// 適合于需要高可預測性和低延遲的大型應用程序。)
java -XX:+UseG1GC
四、使用逃逸分析創建對象
逃逸分析是JVM在編譯時分析Java程序中對象的作用域的過程。如果JVM可以確定對象的作用域僅限于當前方法或線程,那么JVM可以將對象分配在堆棧上而不是堆上。在堆棧上分配對象比在堆上分配對象更快,因為在堆上分配對象需要進行垃圾回收。
五、JVM友好的代碼?
1、避免使用同步塊和鎖
2、盡可能使用局部變量
3、盡量減少對變量的重復計算(list.size())
4、盡量采用懶加載的策略,即在需要的時候才創建
5、異常不應該用來控制程序流程
6、不要將數組聲明為public static final(無意義,數組的內容還是可以隨意改變的)
7、不創建不使用的對象,不要 import 不使用的類
8、避免使用反射(通過反射加載的類在項目啟動的時候)
9、使用數據庫連接池和線程池(避免頻繁地打開和關閉連接、創建和銷毀線程)
10、容器初始化時盡可能指定長度(避免擴容)
11、避免顯式GC(System.gc(),full gc)
總結
本文講解JVM調優的步驟、常用的JVM調優參數,如何調整堆大小和垃圾回收器,以及寫出JVM友好的代碼。