国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM實戰(zhàn)篇:GC調(diào)優(yōu)

這篇具有很好參考價值的文章主要介紹了JVM實戰(zhàn)篇:GC調(diào)優(yōu)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一.GC調(diào)優(yōu)的核心指標(biāo)

1.1吞吐量(Throughput)

1.2延遲(Latency)

1.3內(nèi)存使用量

二.GC調(diào)優(yōu)的方法

2.1監(jiān)控工具

Jstat工具

VisualVm插件

Prometheus + Grafana

2.2診斷原因

GC日志

GC Viewer

GCeasy

2.3常見的GC模式

正常情況

緩存對象過多

內(nèi)存泄漏

持續(xù)的FULL GC

元空間不足導(dǎo)致的FULL GC

三.修復(fù)GC問題

3.1優(yōu)化基礎(chǔ)JVM參數(shù)

參數(shù)1 : -Xmx 和 –Xms

參數(shù)2 : -XX:MaxMetaspaceSize 和 –XX:MetaspaceSize

參數(shù)3 : -Xss虛擬機棧大小

不建議手動設(shè)置的參數(shù)

其他參數(shù)

3.2垃圾回收器的選擇


GC調(diào)優(yōu)

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

GC調(diào)優(yōu)指的是對垃圾回收(Garbage Collection)進行調(diào)優(yōu)。GC調(diào)優(yōu)的主要目標(biāo)是避免由垃圾回收引起程序性能下降。

GC調(diào)優(yōu)的核心分成三部分:

  1. 通用JVM參數(shù)的設(shè)置。
  2. 特定垃圾回收器的JVM參數(shù)的設(shè)置。
  3. 解決由頻繁的FULL GC引起的程序性能問題。

GC調(diào)優(yōu)沒有唯一的標(biāo)準(zhǔn)答案,如何調(diào)優(yōu)與硬件、程序本身、使用情況均有關(guān)系,重點學(xué)習(xí)調(diào)優(yōu)的工具和方法。

一.GC調(diào)優(yōu)的核心指標(biāo)

所以判斷GC是否需要調(diào)優(yōu),需要從三方面來考慮,與GC算法的評判標(biāo)準(zhǔn)類似:

1.1吞吐量(Throughput)

吞吐量分為業(yè)務(wù)吞吐量垃圾回收吞吐量

業(yè)務(wù)吞吐量指的在一段時間內(nèi),程序需要完成的業(yè)務(wù)數(shù)量。比如企業(yè)中對于吞吐量的要求可能會是這樣的:

  • 支持用戶每天生成10000筆訂單
  • 在晚上8點到10點,支持用戶查詢50000條商品信息

保證高吞吐量的常規(guī)手段有兩條:

  1. 優(yōu)化業(yè)務(wù)執(zhí)行性能,減少單次業(yè)務(wù)的執(zhí)行時間
  2. 優(yōu)化垃圾回收吞吐量

垃圾回收吞吐量指的是 CPU 用于執(zhí)行用戶代碼的時間與 CPU 總執(zhí)行時間的比值,即吞吐量 = 執(zhí)行用戶代碼時間 /(執(zhí)行用戶代碼時間 + GC時間)。吞吐量數(shù)值越高,垃圾回收的效率就越高,允許更多的CPU時間去處理用戶的業(yè)務(wù),相應(yīng)的業(yè)務(wù)吞吐量也就越高。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

1.2延遲(Latency)

延遲指的是從用戶發(fā)起一個請求到收到響應(yīng)這其中經(jīng)歷的時間。

延遲 = GC延遲 + 業(yè)務(wù)執(zhí)行時間,所以如果GC時間過長,會影響到用戶的使用。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

1.3內(nèi)存使用量

內(nèi)存使用量指的是Java應(yīng)用占用系統(tǒng)內(nèi)存的最大值,一般通過JVM參數(shù)調(diào)整,在滿足上述兩個指標(biāo)的前提下, 這個值越小越好。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

通常這3個指標(biāo)不能同時兼顧

二.GC調(diào)優(yōu)的方法

2.1監(jiān)控工具

Jstat工具

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

無法精確到GC產(chǎn)生的時間,只能 用于判斷GC是否存在問題

VisualVm插件

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

Prometheus + Grafana

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

2.2診斷原因

GC日志

通過GC日志,可以更好的看到垃圾回收細(xì)節(jié)上的數(shù)據(jù),同時也可以根據(jù)每款垃圾回收器的不同特點更好地發(fā)現(xiàn)存在的問題。

  • 使用方法(JDK 8及以下):-XX:+PrintGCDetails -Xloggc:文件名
  • 使用方法(JDK 9+):-Xlog:gc*:file=文件名

注:?-verbose:gc 是將GC日志輸出到控制臺上,而上面是將GC日志單獨輸出到一個文件

GC Viewer

GCViewer是一個將GC日志轉(zhuǎn)換成可視化圖表的小工具,github地址:https://github.com/chewiebug/GCViewer

使用方法:java -jar gcviewer的jar包 日志文件.log

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

GCeasy

GCViewer是將GC日志可視化,而GCeasy是業(yè)界首款使用AI機器學(xué)習(xí)技術(shù)在線進行GC分析和診斷的工具。定位內(nèi)存泄漏、GC延遲高的問題,提供JVM參數(shù)優(yōu)化建議,支持在線的可視化工具圖表展示。官方網(wǎng)站:Universal JVM GC analyzer - Java Garbage collection log analysis made easy (gceasy.io)

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

2.3常見的GC模式

正常情況

特點:呈現(xiàn)鋸齒狀,對象創(chuàng)建之后內(nèi)存上升,一旦發(fā)生垃圾回收之后下降到底部,并且每次下降之后的內(nèi)存大小接近,存留的對象較少。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

緩存對象過多

特點:呈現(xiàn)鋸齒狀,對象創(chuàng)建之后內(nèi)存上升,一旦發(fā)生垃圾回收之后下降到底部,并且每次下降之后的內(nèi)存大小接近,處于比較高的位置。

問題產(chǎn)生原因: 程序中保存了大量的緩存對象,導(dǎo)致GC之后無法釋放,可以使用MAT或者HeapHero等工具進行分析內(nèi)存占用的原因。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

內(nèi)存泄漏

特點:呈現(xiàn)鋸齒狀,每次垃圾回收之后下降到的內(nèi)存位置越來越高,最后由于垃圾回收無法釋放空間導(dǎo)致對象無法分配產(chǎn)生OutOfMemory的錯誤。

問題產(chǎn)生原因: 程序中保存了大量的內(nèi)存泄漏對象,導(dǎo)致GC之后無法釋放,可以使用MAT或者HeapHero等工具 進行分析是哪些對象產(chǎn)生了內(nèi)存泄漏。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

持續(xù)的FULL GC

特點:在某個時間點產(chǎn)生多次Full GC,CPU使用率同時飆高,用戶請求基本無法處理。一段時間之后恢復(fù)正常。

問題產(chǎn)生原因:在該時間范圍請求量激增,程序開始生成更多對象,同時垃圾收集無法跟上對象創(chuàng)建速率,導(dǎo)致持續(xù)地在進行FULL GC。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

元空間不足導(dǎo)致的FULL GC

特點:堆內(nèi)存的大小并不是特別大,但是持續(xù)發(fā)生FULL GC。

問題產(chǎn)生原因:元空間大小不足,超過了Java虛擬機設(shè)置的閾值,導(dǎo)致持續(xù)FULL GC回收元空間的數(shù)據(jù)。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

三.修復(fù)GC問題

解決GC問題的手段中,前三種是比較推薦的手段,第四種僅在前三種無法解決時選用:

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

3.1優(yōu)化基礎(chǔ)JVM參數(shù)

參數(shù)1 : -Xmx 和 –Xms

-Xmx參數(shù)設(shè)置的是最大堆內(nèi)存,但是由于程序是運行在服務(wù)器或者容器上,計算可用內(nèi)存時,要將元空間、操作系統(tǒng)、 其它軟件占用的內(nèi)存排除掉。

案例:服務(wù)器內(nèi)存4G,操作系統(tǒng)+元空間最大值+其它軟件占用1.5G,-Xmx可以設(shè)置為2g。

最合理的設(shè)置方式應(yīng)該是根據(jù)最大并發(fā)量估算服務(wù)器的配置,然后再根據(jù)服務(wù)器配置計算最大堆內(nèi)存的值。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

-Xms用來設(shè)置初始堆大小,建議將-Xms設(shè)置的和-Xmx一樣大,有以下幾點好處:

  1. 運行時性能更好,堆的擴容是需要向操作系統(tǒng)申請內(nèi)存的,這樣會導(dǎo)致程序性能短期下降。
  2. 可用性問題,如果在擴容時其他程序正在使用大量內(nèi)存,很容易因為操作系統(tǒng)內(nèi)存不足分配失敗。
  3. 啟動速度更快,Oracle官方文檔的原話:如果初始堆太小,Java 應(yīng)用程序啟動會變得很慢,因為 JVM 被迫頻繁執(zhí)行垃圾收集,直到堆增長到更合理的大小。為了獲得最佳啟動性能,請將初始堆大小設(shè)置為與最大堆大小相同。

參數(shù)2 : -XX:MaxMetaspaceSize 和 –XX:MetaspaceSize

  • -XX:MaxMetaspaceSize=值 參數(shù)指的是最大元空間大小,默認(rèn)值比較大,如果出現(xiàn)元空間內(nèi)存泄漏會讓操作系統(tǒng)可用內(nèi)存不可控,建議根據(jù)測試情況設(shè)置最大值,一般設(shè)置為256m。當(dāng)元空間大小超過這個值時,會拋出OutOfMemoryError。
  • -XX:MetaspaceSize=值 參數(shù)指的是到達(dá)這個值之后會觸發(fā)FULL GC(指的不是初始元空間大?。?, 后續(xù)什么時候再觸發(fā)JVM會自行計算。如果設(shè)置為和MaxMetaspaceSize一樣大,就不會FULL GC,但是對象也無法回收。

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

參數(shù)3 : -Xss虛擬機棧大小

如果我們不指定棧的大小,JVM 將創(chuàng)建一個具有默認(rèn)大小的棧。大小取決于操作系統(tǒng)和計算機的體系結(jié)構(gòu)。 比如Linux x86 64位 : 1MB,如果不需要用到這么大的棧內(nèi)存,完全可以將此值調(diào)小節(jié)省內(nèi)存空間,合理值為256k – 1m之間。

使用:-Xss256k

不建議手動設(shè)置的參數(shù)

由于JVM底層設(shè)計極為復(fù)雜,一個參數(shù)的調(diào)整也許讓某個接口得益,但同樣有可能影響其他更多接口。

  • -Xmn 年輕代的大小,默認(rèn)值為整個堆的1/3,可以根據(jù)峰值流量計算最大的年輕代大小,盡量讓對象只存放在年輕代,不進入老年代。但是實際的場景中,接口的響應(yīng)時間、創(chuàng)建對象的大小、程序內(nèi)部還會有一些定時任務(wù)等不 確定因素都會導(dǎo)致這個值的大小并不能僅憑計算得出,如果設(shè)置該值要進行大量的測試。G1垃圾回收器盡量不要設(shè)置該值,G1會動態(tài)調(diào)整年輕代的大小。JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm
  • ‐XX:SurvivorRatio 伊甸園區(qū)和幸存者區(qū)的大小比例,默認(rèn)值為8。JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm
  • ‐XX:MaxTenuringThreshold 最大晉升閾值,年齡大于此值之后,會進入老年代。另外JVM有動態(tài)年齡判斷機制:當(dāng)?survior 區(qū)域的存活對象的總大小占用了?survior 區(qū)域大小的50%(可以通過參數(shù)指定),那么此時將按照這些對象的存活年齡從小到大排序,然后依次累加,當(dāng)累加到對象大小超過50%,則將大于等于當(dāng)前對象年齡的存活對象全部挪到老年代。JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

其他參數(shù)

  • -XX:+DisableExplicitGC?禁止在代碼中使用System.gc(), System.gc()可能會引起FULL GC,在代碼中盡量不要使用。使用DisableExplicitGC參數(shù)可以禁止使用System.gc()方法調(diào)用。
  • -XX:+HeapDumpOnOutOfMemoryError 發(fā)生OutOfMemoryError錯誤時,自動生成hprof內(nèi)存快照文件。
  • -XX:HeapDumpPath= 指定hprof文件的輸出路徑。
  • 打印GC日志

    • JDK8及之前 : -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:文件路徑

    • JDK9及之后 : -Xlog:gc*:file=文件路徑

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

3.2垃圾回收器的選擇

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm

JVM實戰(zhàn)篇:GC調(diào)優(yōu),JVM,jvm文章來源地址http://www.zghlxwxcb.cn/news/detail-818592.html

到了這里,關(guān)于JVM實戰(zhàn)篇:GC調(diào)優(yōu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java線上故障排查(CPU、磁盤、內(nèi)存、網(wǎng)絡(luò)、GC)+JVM性能調(diào)優(yōu)監(jiān)控工具+JVM常用參數(shù)和命令

    Java線上故障排查(CPU、磁盤、內(nèi)存、網(wǎng)絡(luò)、GC)+JVM性能調(diào)優(yōu)監(jiān)控工具+JVM常用參數(shù)和命令

    根據(jù)服務(wù)部署和項目架構(gòu),從如下幾個方面排查: (1)運用服務(wù)器:排查內(nèi)存,cpu,請求數(shù)等; (2)文件圖片服務(wù)器:排查內(nèi)存,cpu,請求數(shù)等; (3)計時器服務(wù)器:排查內(nèi)存,cpu,請求數(shù)等; (4)redis服務(wù)器:排查內(nèi)存,cpu,連接數(shù)等; (5)db服務(wù)器:排查內(nèi)存,cpu,連接數(shù)

    2024年02月07日
    瀏覽(30)
  • JVM實戰(zhàn)(16)——模擬Young GC

    JVM實戰(zhàn)(16)——模擬Young GC

    作者簡介:大家好,我是smart哥,前中興通訊、美團架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進群,大家一起學(xué)習(xí),一起進步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實! 階段1、深入多線程 階段2、深入多線程設(shè)計模式 階段3、深入juc源碼解析

    2024年01月18日
    瀏覽(24)
  • JVM實戰(zhàn)(18)——模擬Full GC

    JVM實戰(zhàn)(18)——模擬Full GC

    作者簡介:大家好,我是smart哥,前中興通訊、美團架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進群,大家一起學(xué)習(xí),一起進步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實! 階段1、深入多線程 階段2、深入多線程設(shè)計模式 階段3、深入juc源碼解析

    2024年01月18日
    瀏覽(16)
  • JVM實戰(zhàn)(19)——JVM調(diào)優(yōu)工具概述

    JVM實戰(zhàn)(19)——JVM調(diào)優(yōu)工具概述

    作者簡介:大家好,我是smart哥,前中興通訊、美團架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO 聯(lián)系qq:184480602,加我進群,大家一起學(xué)習(xí),一起進步,一起對抗互聯(lián)網(wǎng)寒冬 學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實! 階段1、深入多線程 階段2、深入多線程設(shè)計模式 階段3、深入juc源碼解析

    2024年01月18日
    瀏覽(20)
  • JVM調(diào)優(yōu)實戰(zhàn)

    JVM調(diào)優(yōu)實戰(zhàn)

    用top命令,看看是哪個進程CPU占用率高,獲取它的進程ID,再根據(jù)具體的進程id,執(zhí)行 top -HP 進程id號? 命令,看看哪個線程的CPU占用率高,如果是業(yè)務(wù)線程出現(xiàn)問題,則根據(jù)線程ID去檢查業(yè)務(wù)代碼;如果是GC線程占用率高,去看看日志再確定具體問題(有可能發(fā)生內(nèi)存泄漏)。

    2024年02月07日
    瀏覽(18)
  • 11-JVM調(diào)優(yōu)實戰(zhàn)-1

    11-JVM調(diào)優(yōu)實戰(zhàn)-1

    上一篇:10-JVM調(diào)優(yōu)工具詳解 jstat -gc pid 最常用,可以評估程序內(nèi)存使用及GC壓力整體情況 S0C:第一個幸存區(qū)的大小,單位KB S1C:第二個幸存區(qū)的大小 S0U:第一個幸存區(qū)的使用大小 S1U:第二個幸存區(qū)的使用大小 EC:伊甸園區(qū)的大小 EU:伊甸園區(qū)的使用大小 OC:老年代大小 OU:

    2024年02月09日
    瀏覽(17)
  • 13-JVM調(diào)優(yōu)實戰(zhàn)-3

    13-JVM調(diào)優(yōu)實戰(zhàn)-3

    上一篇:12-JVM調(diào)優(yōu)實戰(zhàn)-2 今天來介紹一款阿里巴巴的調(diào)優(yōu)工具。 Arthas詳解 Arthas 是 Alibaba 在 2018 年 9 月開源的 Java 診斷工具。支持 JDK6+, 采用命令行交互模式,可以方便的定位和診斷線上程序運行問題。Arthas 官方文檔十分詳細(xì),詳見:https://arthas.aliyun.com/ 得益于 Arthas 強大且

    2024年02月09日
    瀏覽(9)
  • 【Java虛擬機】JVM調(diào)優(yōu)和分析案例綜合實戰(zhàn)

    【Java虛擬機】JVM調(diào)優(yōu)和分析案例綜合實戰(zhàn)

    1.什么是JVM性能優(yōu)化 jvm性能優(yōu)化涉及到兩個很重要的概念:吞吐量和響應(yīng)時間。jvm調(diào)優(yōu)主要是針對他們進行調(diào)整優(yōu)化,達(dá)到一個理想的目標(biāo),根據(jù)業(yè)務(wù)確定目標(biāo)是吞吐量優(yōu)先還是響應(yīng)時間優(yōu)先。 吞吐量:用戶代碼執(zhí)行時間/(用戶代碼執(zhí)行時間+GC執(zhí)行時間)。 響應(yīng)時間:整個接

    2024年02月03日
    瀏覽(35)
  • 深度剖析JVM調(diào)優(yōu)法則,神器Arthas從CPU/內(nèi)存出發(fā)輕松掌握調(diào)優(yōu)實戰(zhàn)技巧

    深度剖析JVM調(diào)優(yōu)法則,神器Arthas從CPU/內(nèi)存出發(fā)輕松掌握調(diào)優(yōu)實戰(zhàn)技巧

    場景一、CPU過高 CPU占用過高排查思路: step1:進行arthas step2:輸入deashboard 如何不記得命令可以在控制臺輸入help step3:查看線程棧信息 從線程棧信息中定位到具體的java代碼。 場景二、內(nèi)存占用過高 內(nèi)存占用過高排查思路: step1:進行arthas step2:輸入deashboard 在dashboard頁面中

    2024年02月06日
    瀏覽(39)
  • JVM監(jiān)控和調(diào)優(yōu)常用命令jps|jstat|jinfo|jmap|jhat|jstack實戰(zhàn)

    性能優(yōu)化 :通過JVM調(diào)優(yōu),可以提高Java應(yīng)用程序的性能,減少響應(yīng)時間,提高吞吐量,以更好地滿足用戶需求。性能優(yōu)化可以加快應(yīng)用程序的執(zhí)行速度,減少延遲,提高用戶體驗。 內(nèi)存管理 :JVM負(fù)責(zé)管理Java應(yīng)用程序的內(nèi)存。正確的內(nèi)存管理可以避免內(nèi)存泄漏和內(nèi)存溢出等問

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包