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

JVM實戰(zhàn)(13)——JVM優(yōu)化概述

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

作者簡介:大家好,我是smart哥,前中興通訊、美團(tuán)架構(gòu)師,現(xiàn)某互聯(lián)網(wǎng)公司CTO

聯(lián)系qq:184480602,加我進(jìn)群,大家一起學(xué)習(xí),一起進(jìn)步,一起對抗互聯(lián)網(wǎng)寒冬

學(xué)習(xí)必須往深處挖,挖的越深,基礎(chǔ)越扎實!

階段1、深入多線程

階段2、深入多線程設(shè)計模式

階段3、深入juc源碼解析

階段4、深入jdk其余源碼解析

階段5、深入jvm源碼解析

一、簡介

本章,我們先來對系統(tǒng)運行過程中可能會遇到的各種JVM性能問題作個概述,以此為引子,作為后續(xù)實戰(zhàn)篇的鋪墊。

JVM性能優(yōu)化其實就是針對JVM內(nèi)存分配、參數(shù)設(shè)置進(jìn)行優(yōu)化,目的是減少GC次數(shù),避免對象頻繁進(jìn)入老年代。所以,我們來先來回顧下新生代和老年代的垃圾回收過程,并看下可能會引發(fā)的各種JVM性能問題。

在正式開始之前,我先給出一份JVM調(diào)優(yōu)模板,這份模板基本上涵蓋了JVM調(diào)優(yōu)所需的所有核心參數(shù),后續(xù)我們所有的調(diào)優(yōu)也會圍繞它展開:
-Xms4096M -Xmx4096M -Xmn3072M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFaction=92 -XX:UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSParallellInitialMarkEnabled -XX:CMSScavengeBeforeRemark -XX:DisableExplicitGC -XX:PrintGCDetail -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath:/usr/local/app/oom.hprof

上述有些參數(shù)看不懂沒關(guān)系,我們在后續(xù)的各個實戰(zhàn)章節(jié)中都會陸續(xù)提到,這里先簡要說下:
首先,JVM中各塊內(nèi)存區(qū)域大小的分配是根據(jù)系統(tǒng)運行模型來配置的,然后是ParNew和CMS這兩種垃圾回收器的配置,特別注意CMS的一些參數(shù),主要是提升CMS的效率和性能,還有就是打印GC日志,日志可以借助后續(xù)章節(jié)會講到的jstat工具進(jìn)行分析,最后兩個參數(shù)是在發(fā)生內(nèi)存溢出異常時,自動dump出內(nèi)存快照,然后就可以通過MAT等工具進(jìn)行分析了。

二、JVM性能問題

JVM運行時,最核心的區(qū)域就是Java堆內(nèi)存,這里會存放我們系統(tǒng)創(chuàng)建出來的各種對象。而且堆內(nèi)存通常劃分為新生代和老年代,新生代存放新創(chuàng)建出來的各種對象。所以,我們先來看下新生代GC會有哪些問題。

2.1 新生代GC

隨著系統(tǒng)的不斷運行,新生代中的對象會越來越多,直到快被塞滿。此時會根據(jù)GC Roots去尋找存活的對象。GC Roots一般是類靜態(tài)變量或方法的局部變量。由于我們創(chuàng)建對象最多的地方是在方法內(nèi),方法運行完畢,局部變量就沒有了,所以新生代中這種對象其實占了99%,這也是新生代對象存活率低的原因。

JVM實戰(zhàn)(13)——JVM優(yōu)化概述,jvm專題,jvm

新生代進(jìn)行Minor GC時,會采用?復(fù)制算法?,將Eden區(qū)和一塊Survivor區(qū)的存活對象復(fù)制到另一塊Survivor區(qū),然后清空Eden和之前的Survivor。同時,新生代GC期間會”Stop the World“,即只允許GC線程進(jìn)行回收工作,其它工作線程都會被掛起。

JVM實戰(zhàn)(13)——JVM優(yōu)化概述,jvm專題,jvm

假設(shè)一次新生代的GC需要20ms,那么此時對于用戶發(fā)送的請求,這20ms內(nèi)是無法處理的,系統(tǒng)會卡頓20ms。但是新生代的GC速度非???,所以只要不頻繁GC,其實對系統(tǒng)是沒什么影響的。所以,新生代GC其實沒什么好調(diào)優(yōu)的,只要多分配點堆內(nèi)存,保證Survivor區(qū)空間充足,那么低峰時期一般幾小時才有一次新生代GC,高峰期也最多幾分鐘一次新生代GC。

那么,什么時候新生代GC會對系統(tǒng)產(chǎn)生很大的影響呢?

當(dāng)系統(tǒng)部署在大內(nèi)存機器上時,比如32核64G的機器,新生代的Eden區(qū)可能有32G以上的內(nèi)存。

此時,如果系統(tǒng)的負(fù)載特別高(比如部署了Kafka、Elasticsearch每秒處理上萬的請求),那么可能導(dǎo)致Eden區(qū)的幾十G空間在短短幾分鐘內(nèi)被塞滿。而此時進(jìn)行新生代GC會停止系統(tǒng)的運行,由于新生代空間非常大,GC時間會很長,可能長達(dá)數(shù)秒鐘。

對于一個高負(fù)載高并發(fā)的系統(tǒng),每隔幾分鐘就停頓幾秒去進(jìn)行新生代GC,是不可接受的。

解決方案一般就是使用G1垃圾回收器,因為G1可以設(shè)置一個預(yù)期停頓時間(比如20ms),那么G1基于它的Region內(nèi)存劃分原理,就可以在運行一段時間之后,回收一部分Region,控制時間在20ms內(nèi),然后再運行再回收。

所以,?G1天生就適合在這種大內(nèi)存的機器上運行,可以完美解決大內(nèi)存垃圾回收時間過長的問題。

2.2 老年代GC

之前給大家講過新生代中對象晉升到老年代的幾個可能條件:

  • 年齡太大
  • 符合動態(tài)年齡判斷規(guī)則
  • 大對象
  • 新生代GC后存活的對象放不下Survivor區(qū)

上述條件中,關(guān)鍵是動態(tài)年齡判斷和對象放不下Survivor區(qū),從而導(dǎo)致大量對象頻繁進(jìn)入老年代:

JVM實戰(zhàn)(13)——JVM優(yōu)化概述,jvm專題,jvm

老年代GC非常耗時,無論是CMS還是G1。通常老年代GC要比新生代GC慢十倍以上,所以針對老年代GC的優(yōu)化還是要先從新生代GC入手,合理分配內(nèi)存和設(shè)置JVM參數(shù),盡量讓對象不要頻繁進(jìn)入老年代。

三、各種GC分類

在基礎(chǔ)篇,我們介紹過各種GC類型,Minor GC、Full GC、Mixed GC、Young GC等等。本節(jié)我們就來統(tǒng)一梳理下。

3.1 Minor GC/Young GC

當(dāng)新生代的Eden區(qū)域被占滿后,實際就需要觸發(fā)新生代的GC,這就是所謂的”Minor GC“,也可以稱之為”Young GC“。后續(xù)章節(jié),我們統(tǒng)一用Young GC指代新生代的GC。

觸發(fā)時機:?新生代的Eden區(qū)域被占滿后。

3.2 Full GC/Old GC

Old GC是僅僅針對老年代區(qū)域進(jìn)行垃圾回收。而Full GC則是針對新生代、老年代、永久代的全體內(nèi)存空間進(jìn)行垃圾回收。后續(xù)章節(jié),我們統(tǒng)一用Old GC指代老生代的GC。

觸發(fā)時機:?老年代空間不夠。具體時機可細(xì)分為以下幾種:

  1. 進(jìn)行Young GC之前:如果老年代的連續(xù)可用內(nèi)存空間 < 新生代歷次晉升的平均大小,此時先觸發(fā)一次Old GC清理老年代,然后再執(zhí)行Young GC。
  2. 進(jìn)行Young GC之后:如果存活對象要進(jìn)入老年代,但是老年代的連續(xù)可用內(nèi)存空間 < 存放對象的大小,此時必須觸發(fā)一次Old GC。
  3. 老年代的內(nèi)存使用率超過了92%,此時也會觸發(fā)Old GC。

在很多JVM的實現(xiàn)機制里,當(dāng)上述幾種條件達(dá)到時,實際觸發(fā)的其實是Full GC,這個Full GC會包含Young GC、Old GC和永久代GC。

3.3 Mixed GC

Mixed GC是G1垃圾回收器中特有的概念,在G1中,一旦老年代占據(jù)了Java堆內(nèi)存的45%,就會觸發(fā)Mixed GC,此時對新生代和老年代都進(jìn)行垃圾回收。

觸發(fā)時機:?G1特有,老年代空間占據(jù)到Java堆內(nèi)存的45%。

3.4 永久代GC

永久代一般存放著類信息、常量池等等。在進(jìn)行Full GC的時候,會順帶對永久代進(jìn)行GC,一般來說永久代里的東西是不需要回收的,如果永久代真的滿了,回收之后也沒騰出足夠的空間來,就會拋出OOM異常。文章來源地址http://www.zghlxwxcb.cn/news/detail-801281.html

到了這里,關(guān)于JVM實戰(zhàn)(13)——JVM優(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ìn)行投訴反饋,一經(jīng)查實,立即刪除!

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

相關(guān)文章

  • JVM實戰(zhàn)(25)——元數(shù)據(jù)區(qū)優(yōu)化

    JVM實戰(zhàn)(25)——元數(shù)據(jù)區(qū)優(yōu)化

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

    2024年01月22日
    瀏覽(27)
  • 【JVM】JVM概述

    【JVM】JVM概述

    基本介紹 JVM:全稱 Java Virtual Machine,即 Java 虛擬機,一種規(guī)范,本身是一個虛擬計算機,直接和操作系統(tǒng)進(jìn)行交互,與硬件不直接交互,而操作系統(tǒng)可以幫我們完成和硬件進(jìn)行交互的工作 特點: Java 虛擬機基于 二進(jìn)制字節(jié)碼 執(zhí)行,由一套字節(jié)碼指令集、一組寄存器、一個棧

    2024年01月18日
    瀏覽(15)
  • JAVA工程師面試專題-JVM篇

    目錄 一、運行時數(shù)據(jù)區(qū) 1、說一下JVM的主要組成部分及其作用? 2、說一下 JVM 運行時數(shù)據(jù)區(qū) ? 3、說一下堆棧的區(qū)別 4、成員變量、局部變量、類變量分別存儲在什么地方? 5、類常量池、運行時常量池、字符串常量池有什么區(qū)別? 6、JVM為什么使用元空間替換永久代 二、垃

    2024年02月21日
    瀏覽(17)
  • 【jvm系列-13】jvm性能調(diào)優(yōu)篇---參數(shù)設(shè)置以及日志分析

    【jvm系列-13】jvm性能調(diào)優(yōu)篇---參數(shù)設(shè)置以及日志分析

    JVM系列整體欄目 內(nèi)容 鏈接地址 【一】初識虛擬機與java虛擬機 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的類加載子系統(tǒng)以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】運行時私有區(qū)域之虛擬機棧、程序計數(shù)器、本地方法棧 https

    2024年02月06日
    瀏覽(30)
  • JVM垃圾回收概述

    Java和C++的區(qū)別就在于垃圾回收技術(shù)和內(nèi)存的動態(tài)分配上,C++沒有相應(yīng)的垃圾收集技術(shù),只能手動的回收。而Java語言中有自動的垃圾回收機制,這大大的提高了開發(fā)效率。注意:垃圾回收算法并不是Java語言的產(chǎn)物。 垃圾是指在運行程序的過程中 沒有任何引用指向的對象 ,這

    2024年02月16日
    瀏覽(19)
  • JVM概述

    JVM概述

    1.什么是虛擬機? 虛擬機就是一臺 虛擬的計算機 。它是一款 軟件 ,它分為 系統(tǒng)虛擬機 (比如 VMware )和 程序虛擬機 (比如 Java虛擬機 )。 2.JVM的作用 Java虛擬機負(fù)責(zé)裝載字節(jié)碼文件到內(nèi)部, 編譯 為對應(yīng)平臺上的 機器碼 指令來執(zhí)行,還有 自動的垃圾回收 功能。 3.JVM的組成 類

    2024年02月16日
    瀏覽(14)
  • JVM GC 算法原理概述

    JVM GC 算法原理概述

    對于JVM的垃圾收集(GC),這是一個作為Java開發(fā)者必須了解的內(nèi)容,那么,我們需要去了解哪些內(nèi)容呢,其實,GC主要是解決下面的三個問題: 哪些內(nèi)存需要回收? 什么時候回收? 如何回收? 回答了這三個問題,也就對于GC算法的原理有了最基本的了解。 1 如何判定哪些內(nèi)

    2024年02月03日
    瀏覽(19)
  • JVM工作的總體機制概述

    JVM工作的總體機制概述

    JVM:Java Virtual Machine,翻譯過來是Java虛擬機 JRE:Java Runtime Environment,翻譯過來是Java運行時環(huán)境 JRE=JVM+Java程序運行時所需要的類庫 JDK:Java Development Kits,翻譯過來是Java開發(fā)工具包 JDK=JRE+Java開發(fā)輔助工具 Java源程序→編譯→字節(jié)碼文件→放到JVM上運行 總體機制的粗略描述:

    2024年02月13日
    瀏覽(14)
  • JVM(Java虛擬機)概述

    ? ? ?JVM(Java Virtual Machine)是一個能夠運行Java字節(jié)碼的虛擬計算機。它是Java平臺的核心組成部分,負(fù)責(zé)執(zhí)行編譯后的Java程序,提供跨平臺運行的能力。JVM使得Java程序可以在任何安裝了JVM的操作系統(tǒng)上運行,無需對代碼進(jìn)行修改,實現(xiàn)了\\\"一次編寫,到處運行\(zhòng)\\"(Write Once, Ru

    2024年03月11日
    瀏覽(25)
  • 一、認(rèn)識 JVM 規(guī)范(JVM 概述、字節(jié)碼指令集、Class文件解析、ASM)

    一、認(rèn)識 JVM 規(guī)范(JVM 概述、字節(jié)碼指令集、Class文件解析、ASM)

    JVM : Java Virtual Machine ,也就是 Java 虛擬機 所謂虛擬機是指:通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的計算機系統(tǒng)。 即:虛擬機是一個計算機系統(tǒng)。這種計算機系統(tǒng)運行在完全隔離的環(huán)境中,且它的硬件系統(tǒng)功能是通過軟件模擬出來的。 JVM 通

    2024年01月23日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包