【性能優化】JVM調優與寫出JVM友好高效的代碼

📫作者簡介:小明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友好的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試:Kafka相關問題

文章目錄 簡單介紹kafkakafka應用場景為什么需要zookeeperZookeeper 對于 Kafka 的作用是什么&#xff1f;kafka高效的原因kafka的特點kafka的核心組成Kafka中的Topic和Partition有什么關系&#xff1f;Kafka的消費消息是如何傳遞的&#xff1f;Kafka 的多副本機制了解嗎&#…

STM32:基本定時器原理和定時程序

一、初識定時器TIM 定時器就是計數器&#xff0c;定時器的作用就是設置一個時間&#xff0c;然后時間到后就會通過中斷等方式通知STM32執行某些程序。定時器除了可以實現普通的定時功能&#xff0c;還可以實現捕獲脈沖寬度&#xff0c;計算PWM占空比&#xff0c;輸出PWM波形&am…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官網并沒有提供各個前端框架Vue&#xff0c;React&#xff0c;Angular的直接使用的適配版本&#xff0c; 所以本次使用的vue3-ace-editor 是個人開源者維護的版本&#xff0c;原生是支持 SFC 模版用的&#xff0c;由于我這里習慣使用 JSX 或 TSX的方式&a…

【03】ES6:解構賦值

一、數組的解構賦值 ES6 允許按照一定模式&#xff0c;從數組和對象中提取值&#xff0c;對變量進行賦值&#xff0c;這被稱為解構&#xff08;Destructuring&#xff09;。 1、基本使用 遵循 “模式匹配” &#xff0c;索引值相同的完成賦值 // 為變量賦值&#xff0c;只能…

Centos7 Python環境和yum修復

1、刪除現有殘余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##驗證清除&…

mybatis注解方式動態標簽時有特殊符號,出現元素內容必須由格式正確的字符數據或標記組成

原始代碼demo Select("SELECT COUNT(1) FROM AAAA WHERE name #{nage} AND age< 4") public Integer sumXxxxx(String nage, String age);現需求改為nage可以為空&#xff0c;因此使用了動態拼接 Select("<script> SELECT COUNT(1) FROM AAAA WHERE …

SWT/Jface(2): 表格的編輯

前言 上節說到, 創建和渲染表格需要如下幾個步驟: 接收源數據數組(也可以是單個對象或者其他集合類型): TableViewer.setInput(Object)渲染接收的數據 渲染表頭: TableViewer.setLabelProvider(IBaseLabelProvider)渲染內容: TableViewer.setContentProvider(IContentProvide…

java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx

windows系統下連接hdfs進行操作時&#xff0c;上來就出現java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx java.lang.IllegalArgumentException: java.net.UnknownHostException: liujianat org.apache.hadoop.security.SecurityUtil.buildTokenServ…

Keil Vision5—新建工程project

注意&#xff1a;創建的工程目錄必須是純英文目錄 目錄 1.開始配置 2.為該路徑下新建個文件夾 3.選擇器件 4.工程配置 4.右擊魔術棒&#xff0c;設置參數 ?編輯 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

字符串結尾空格比較相關參數BLANK_PAD_MODE(DM8:達夢數據庫)

DM8:達夢數據庫 字符串結尾空格比較相關參數BLANK_PAD_MODE 環境介紹1 BLANK_PAD_MODE01.1 初始化數據庫1.2 創建測試表 T0 2 BLANK_PAD_MODE12.1 初始化數據庫2.2 創建測試表 T1 3 BLANK_PAD_MODE只對字段varchar類型生效3.1 BLANK_PAD_MODE 對char 類型對比無效3.2 在兩個數據…

計算機中了halo勒索病毒怎么清除,halo勒索病毒解密數據恢復

科技的進步加快了企業發展的步伐&#xff0c;網絡技術的不斷應用為企業的生產運營提供了極大幫助&#xff0c;但隨之而來的網絡安全威脅也不斷增加&#xff0c;近期&#xff0c;云天數據恢復中心接到很多企業的求助&#xff0c;企業的計算機服務器遭到了halo勒索病毒攻擊&#…

Jmeter快速入門

文章目錄 1.安裝Jmeter1.1.下載1.2.解壓1.3.運行 2.快速入門2.1.設置中文語言2.2.基本用法 1.安裝Jmeter Jmeter依賴于JDK&#xff0c;所以必須確保當前計算機上已經安裝了JDK&#xff0c;并且配置了環境變量。 1.1.下載 可以Apache Jmeter官網下載&#xff0c;地址&#xf…

uni-app打包后,打開軟件時使其橫屏顯示

找到page.json文件&#xff0c;在global加入以下代碼&#xff1a; 這樣就可以橫屏顯示了。

CANdelaStudio 使用教程 1

文章目錄 CANdelaStudio 軟件下載CANdelaStudio 軟件的權限View Edition 和 Admin Edition 區別&#xff1a;打開文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的區別 CANdelaStudio 軟件下載 1、 來到 Vector 官網下載中心 https://www.vector.com/cn/zh…

[shader] 光照入門(未完結。。。

反射 漫反射&#xff1a;而當物體表面粗糙時&#xff0c;我們把物體表面看作無數不同方向的微小鏡面&#xff0c;則這些鏡面反射出的光方向均不相同&#xff0c;這就是漫反射。 高光反射&#xff1a;我們假定物體表面光滑&#xff0c;只有一個鏡面&#xff0c;那么所有的光都…

報錯For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.報錯For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 報錯信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣971. 翻轉二叉樹以匹配先序遍歷二、力扣987. 二叉樹的垂序遍歷三、力扣666. 路徑總和 IV 前言 二叉樹的遞歸分為「遍歷」和「分解問題」兩種思維模式&a…

面試:RocketMQ相關問題

文章目錄 什么是 RocketMQ&#xff0c;有哪些使用場景&#xff1f;RocketMQ 由哪些?色組成&#xff0c;每個?色作用和特點是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么區別&#xff1f;RocketMQ 消費模式有幾種&#xff1f;RocketMQ 的 Consumer 是如何消費…

【深度學習】Python快捷調用InsightFace人臉檢測,純ONNX推理

pypi資料&#xff1a; https://pypi.org/project/insightface/ 模型選擇&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU對應CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地級市城鎮居民人均消費性支出數據

1999-2021年地級市城鎮居民人均消費性支出數據 1、時間&#xff1a;1999-2021年 2、指標&#xff1a;城鎮居民人均消費性支出 3、范圍&#xff1a;290個地級市 4、來源&#xff1a;城市年鑒、地級市統計公報 5、指標解釋&#xff1a; 城鎮居民人均消費性支出&#xff1a;指…