<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          美團面試:熟悉哪些JVM調(diào)優(yōu)參數(shù),幸好我準(zhǔn)備過!

          共 6517字,需瀏覽 14分鐘

           ·

          2021-09-21 23:04

          關(guān)注公眾號Java后端技術(shù)全棧

          回復(fù)“000”獲取程序員必備電子書

          大家好,我是田維常,江湖人稱老田、田哥、田神,今天來和大家分享JVM調(diào)優(yōu)參數(shù)。

          之前,我已經(jīng)分享給六個美團面試的技術(shù)點:

          美團面試:講清楚MySQL結(jié)構(gòu)體系,立馬發(fā)offer

          美團面試:慢SQL有遇到過嗎?是怎么解決的?

          美團面試:String s = new String("111")會創(chuàng)建幾個對象?

          美團面試:為什么就能直接調(diào)用userMapper接口的方法?

          美團面試:接口被惡意狂刷,怎么辦?

          美團面試:MySQL中有哪些鎖?當(dāng)時我就懵逼了!

          實話實說,很多人干了三、五年的Java開發(fā),照樣沒用使用過JVM調(diào)優(yōu)參數(shù)。

          但是,面試官可不管你有沒有用過,面試官心里想的是“這問題回答不出來,證明你很low B,還想要那么高的薪資,沒門”。

          話不多說,我們開始今天的干貨。

          首先,看看本文主要內(nèi)容:

          img

          今天來熟悉一下,關(guān)于JVM調(diào)優(yōu)常用的一些參數(shù)。

          X或者XX開頭的都是非標(biāo)準(zhǔn)化參數(shù)

          意思就是說標(biāo)準(zhǔn)化參數(shù)不會變,非標(biāo)準(zhǔn)化參數(shù)可能在每個JDK版本中有所變化,但是就目前來看X開頭的非標(biāo)準(zhǔn)化的參數(shù)改變的也是非常少。

          格式:-XX:[+-]<name> 表示啟用或者禁用name屬性。
          例子:-XX:+UseG1GC(表示啟用G1垃圾收集器)

          -XX:+PrintCommandLineFlags查看當(dāng)前JVM設(shè)置過的相關(guān)參數(shù):

          JVM參數(shù)分類

          根據(jù)JVM參數(shù)開頭可以區(qū)分參數(shù)類型,共三類:“-”、“-X”、“-XX”,

          標(biāo)準(zhǔn)參數(shù)(-):所有的JVM實現(xiàn)都必須實現(xiàn)這些參數(shù)的功能,而且向后兼容;

          例子:-verbose:class-verbose:gc-verbose:jni……

          非標(biāo)準(zhǔn)參數(shù)(-X):默認(rèn)jvm實現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實現(xiàn)都滿足,且不保證向后兼容;

          例子:Xms20m-Xmx20m-Xmn20m-Xss128k……

          非Stable參數(shù)(-XX):此類參數(shù)各個jvm實現(xiàn)會有所不同,將來可能會隨時取消,需要慎重使用;

          例子:-XX:+PrintGCDetails-XX:-UseParallelGC-XX:+PrintGCTimeStamps……

          堆參數(shù)設(shè)置

          -Xms 初始堆大小,ms是memory start的簡稱 ,等價于-XX:InitialHeapSize-Xmx 最大堆大小,mx是memory max的簡稱 ,等價于參數(shù)-XX:MaxHeapSize

          注意:在通常情況下,服務(wù)器項目在運行過程中,堆空間會不斷的收縮與擴張,勢必會造成不必要的系統(tǒng)壓力。

          所以在生產(chǎn)環(huán)境中,JVMXmsXmx要設(shè)置成大小一樣的,能夠避免GC在調(diào)整堆大小帶來的不必要的壓力。

          -XX:NewSize=n 設(shè)置年輕代大小-XX:NewRatio=n 設(shè)置年輕代和年老代的比值。

          如:-XX:NewRatio=3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4,默認(rèn)新生代和老年代的比例=1:2-XX:SurvivorRatio=n 年輕代中Eden區(qū)與兩個Survivor區(qū)的比值。

          注意Survivor區(qū)有兩個,默認(rèn)是8,表示:Eden:S0:S1=8:1:1

          如:-XX:SurvivorRatio=3,表示Eden:Survivor=3:2,一個Survivor區(qū)占整個年輕代的1/5。

          元空間參數(shù)

          -XX:MetaspaceSizeMetaspace 空間初始大小,如果不設(shè)置的話,默認(rèn)是20.79M,這個初始大小是觸發(fā)首次 Metaspace Full GC的閾值。

          例如:-XX:MetaspaceSize=256M

          -XX:MaxMetaspaceSizeMetaspace 最大值,默認(rèn)不限制大小,但是線上環(huán)境建議設(shè)置。

          例如:-XX:MaxMetaspaceSize=256M

          -XX:MinMetaspaceFreeRatio:最小空閑比,當(dāng) Metaspace 發(fā)生 GC 后,會計算 Metaspace 的空閑比,如果空閑比(空閑空間/當(dāng)前 Metaspace 大小)小于此值,就會觸發(fā) Metaspace 擴容。默認(rèn)值是 40 ,也就是 40%,例如 -XX:MinMetaspaceFreeRatio=40

          -XX:MaxMetaspaceFreeRatio:最大空閑比,當(dāng) Metaspace發(fā)生 GC 后,會計算 Metaspace 的空閑比,如果空閑比(空閑空間/當(dāng)前 Metaspace 大小)大于此值,就會觸發(fā) Metaspace 釋放空間。默認(rèn)值是 70 ,也就是 70%,例如 -XX:MaxMetaspaceFreeRatio=70

          建議將 MetaspaceSizeMaxMetaspaceSize設(shè)置為同樣大小,避免頻繁擴容。

          棧參數(shù)設(shè)置

          -Xss:棧空間大小,棧是線程獨占的,所以是一個線程使用棧空間的大小。

          例如:-Xss256K,如果不設(shè)置此參數(shù),默認(rèn)值是1M,一般來講設(shè)置成 256K 就足夠了。

          收集器參數(shù)設(shè)置

          Serial垃圾收集器(新生代)

          開啟:-XX:+UseSerialGC 關(guān)閉:-XX:-UseSerialGC //新生代使用Serial  老年代則使用SerialOld

          ParNew垃圾收集器(新生代)

          開啟 -XX:+UseParNewGC 關(guān)閉 -XX:-UseParNewGC //新生代使用功能ParNew 老年代則使用功能CMS

          Parallel Scavenge收集器(新生代)

          開啟 -XX:+UseParallelOldGC 關(guān)閉 -XX:-UseParallelOldGC //新生代使用功能Parallel Scavenge 老年代將會使用Parallel Old收集器

          ParallelOl垃圾收集器(老年代)

          開啟 -XX:+UseParallelGC 關(guān)閉 -XX:-UseParallelGC //新生代使用功能Parallel Scavenge 老年代將會使用Parallel Old收集器

          CMS垃圾收集器(老年代)

          開啟 -XX:+UseConcMarkSweepGC 關(guān)閉 -XX:-UseConcMarkSweepGC

          G1垃圾收集器

          開啟 -XX:+UseG1GC 關(guān)閉 -XX:-UseG1GC

          GC策略參數(shù)配置

          GC停頓時間,垃圾收集器會嘗試用各種手段達(dá)到這個時間,比如減小年輕代

          -XX:MaxGCPauseMillis

          堆占用了多少比例的時候觸發(fā)GC,就即觸發(fā)標(biāo)記周期的 Java 堆占用率閾值。默認(rèn)占用率是整個 Java 堆的 45%

          -XX:InitiatingHeapOccupancyPercent=n

          新生代可容納的最大對象,大于則直接會分配到老年代,0代表沒有限制。

          -XX:PretenureSizeThreshold=1000000 //

          進(jìn)入老年代最小的GC年齡,年輕代對象轉(zhuǎn)換為老年代對象最小年齡值,默認(rèn)值7

          -XX:InitialTenuringThreshol=7

          升級老年代年齡,最大值15

          -XX:MaxTenuringThreshold

          GC并行執(zhí)行線程數(shù)

          -XX:ParallelGCThreads=16

          禁用 System.gc(),由于該方法默認(rèn)會觸發(fā) FGC,并且忽略參數(shù)中的 UseG1GC 和 UseConcMarkSweepGC,因此必要時可以禁用該方法。

          -XX:-+DisableExplicitGC

          設(shè)置吞吐量大小,默認(rèn)99

          XX:GCTimeRatio

          打開自適應(yīng)策略,各個區(qū)域的比率,晉升老年代的年齡等參數(shù)會被自動調(diào)整。以達(dá)到吞吐量,停頓時間的平衡點。

          XX:UseAdaptiveSizePolicy

          設(shè)置GC時間占用程序運行時間的百分比

          GCTimeRatio

          Dump異常快照

          -XX:+HeapDumpOnOutOfMemoryError

          -XX:HeapDumpPath

          堆內(nèi)存出現(xiàn)OOM的概率是所有內(nèi)存耗盡異常中最高的,出錯時的堆內(nèi)信息對解決問題非常有幫助。

          所以給JVM設(shè)置這個參數(shù)(-XX:+HeapDumpOnOutOfMemoryError),讓JVM遇到OOM異常時能輸出堆內(nèi)信息,并通過(-XX:+HeapDumpPath)參數(shù)設(shè)置堆內(nèi)存溢出快照輸出的文件地址。

          這對于特別是對相隔數(shù)月才出現(xiàn)的OOM異常尤為重要。

          -Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError 
          -XX:HeapDumpPath=D:\study\log_hprof\gc.hprof

          -XX:OnOutOfMemoryError

          表示發(fā)生OOM后,運行jconsole.exe程序。

          這里可以不用加“”,因為jconsole.exe路徑Program Files含有空格。利用這個參數(shù),我們可以在系統(tǒng)OOM后,自定義一個腳本,可以用來發(fā)送郵件告警信息,可以用來重啟系統(tǒng)等等。

          -XX:OnOutOfMemoryError="C:\Program Files\Java\jdk1.8.0_151\bin\jconsole.exe"

          8G內(nèi)存的服務(wù)器該如何設(shè)置

          java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

          -Xmx3500m 設(shè)置JVM最大可用內(nèi)存為3550M。

          -Xms3500m 設(shè)置JVM初始內(nèi)存為3550m。此值可以設(shè)置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。-Xmn2g 設(shè)置年輕代大小為2G

          整個堆大小=年輕代大小 + 年老代大小 + 方法區(qū)大小

          -Xss128k 設(shè)置每個線程的堆棧大小。

          JDK1.5以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應(yīng)用的線程所需內(nèi)存大小進(jìn)行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進(jìn)程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。

          -XX:NewRatio=4 設(shè)置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設(shè)置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5 。

          -XX:SurvivorRatio=4 設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。

          設(shè)置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6 -XX:MaxPermSize=16m 設(shè)置持久代大小為16m。

          -XX:MaxTenuringThreshold=0 設(shè)置垃圾最大年齡。

          如果設(shè)置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進(jìn)入年老代。對于年老代比較多的應(yīng)用,可以提高效率。如果將此值設(shè)置為一個較大值,則年輕代對象會在Survivor區(qū)進(jìn)行多次復(fù)制,這樣可以增加對象在年輕代的存活時間,增加在年輕代即被回收的概論。

          項目中,GC日志配置

          比如,我們啟動一個user-service項目:

           java  
           -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
           -XX:+UseGCLogFileRotation 
           -XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5  
           -XX:GCLogFileSize=20M    
           -Xloggc:/opt/user-service-gc-%t.log  
           -jar user-service-1.0-SNAPSHOT.jar 

          參數(shù)解釋:

           -Xloggc:/opt/app/ard-user/user-service-gc-%t.log   設(shè)置日志目錄和日志名稱
           -XX:+UseGCLogFileRotation           開啟滾動生成日志
           -XX:NumberOfGCLogFiles=5            滾動GC日志文件數(shù),默認(rèn)0,不滾動
           -XX:GCLogFileSize=20M               GC文件滾動大小,需開啟UseGCLogFileRotation
           -XX:+PrintGCDetails                 開啟記錄GC日志詳細(xì)信息(包括GC類型、各個操作使用的時間),并且在程序運行結(jié)束打印出JVM的內(nèi)存占用情況
           -XX:+ PrintGCDateStamps             記錄系統(tǒng)的GC時間           
           -XX:+PrintGCCause                   產(chǎn)生GC的原因(默認(rèn)開啟)

          項目中沒用過怎么辦?

          對于很多沒用過的人來說,面試官問項目中這些參數(shù)是怎么用?此時,很容易選擇妥協(xié),傻傻的回答沒用過

          偷偷的告訴你,很多面試官也沒有用過。

          另外,你可以自己搞個小項目,把JVM參數(shù)設(shè)置小點,使用測試工具JMeter,多線程測試一下。

          在代碼里可以自己編造以下問題:

          內(nèi)存溢出

          內(nèi)存泄漏

          棧溢出

          然后使用JVM參數(shù)進(jìn)行調(diào)優(yōu),或者通過JVM工具和相關(guān)命令找到問題,然后解決問題。

          2萬字!JVM核心知識總結(jié),贈送18連環(huán)炮

          JDK自帶JVM調(diào)優(yōu)工具,一次性打包講給你聽

          自己一定要動手,別人永遠(yuǎn)是別人的,自己體會了自己經(jīng)歷了,那才是自己的。

          好了,今天就分享到這里了。期待你的關(guān)注、點贊、在看、轉(zhuǎn)發(fā)!

          加我微信,拉你進(jìn)群,和大家一起聊技術(shù)、談人生!


          讀 

          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色护士影院 | 久久永久免费 | 水蜜桃视频高清 | 波多野结衣AV免费观看 | A片在线免费观看视频 |