自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

云計(jì)算 虛擬化
實(shí)話實(shí)說(shuō),很多人干了三、五年的Java開(kāi)發(fā),照樣沒(méi)用使用過(guò)JVM調(diào)優(yōu)參數(shù)。但是,面試官可不管你有沒(méi)有用過(guò),面試官心里想的是“這問(wèn)題回答不出來(lái),證明你很low B,還想要那么高的薪資,沒(méi)門(mén)”。

[[419665]]

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

但是,面試官可不管你有沒(méi)有用過(guò),面試官心里想的是“這問(wèn)題回答不出來(lái),證明你很low B,還想要那么高的薪資,沒(méi)門(mén)”。

話不多說(shuō),我們開(kāi)始今天的干貨。

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

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

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

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

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

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

JVM參數(shù)分類(lèi)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

元空間參數(shù)

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

例如:-XX:MetaspaceSize=256M

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

例如:-XX:MaxMetaspaceSize=256M

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

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

建議將 MetaspaceSize 和 MaxMetaspaceSize設(shè)置為同樣大小,避免頻繁擴(kuò)容。

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

-Xss:??臻g大小,棧是線程獨(dú)占的,所以是一個(gè)線程使用??臻g的大小。

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

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

Serial垃圾收集器(新生代)

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

ParNew垃圾收集器(新生代)

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

Parallel Scavenge收集器(新生代)

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

ParallelOl垃圾收集器(老年代)

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

CMS垃圾收集器(老年代)

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

G1垃圾收集器

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

GC策略參數(shù)配置

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

-XX:MaxGCPauseMillis

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

-XX:InitiatingHeapOccupancyPercent=n

新生代可容納的最大對(duì)象,大于則直接會(huì)分配到老年代,0代表沒(méi)有限制。

-XX:PretenureSizeThreshold=1000000 //

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

-XX:InitialTenuringThreshol=7

升級(jí)老年代年齡,最大值15

-XX:MaxTenuringThreshold

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

-XX:ParallelGCThreads=16

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

-XX:-+DisableExplicitGC

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

XX:GCTimeRatio

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

XX:UseAdaptiveSizePolicy

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

GCTimeRatio

Dump異常快照

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath

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

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

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

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

-XX:OnOutOfMemoryError

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

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

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

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

  1. 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。

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

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

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

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

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

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

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

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

項(xiàng)目中,GC日志配置

比如,我們啟動(dòng)一個(gè)user-service項(xiàng)目:

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

參數(shù)解釋?zhuān)?/p>

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

項(xiàng)目中沒(méi)用過(guò)怎么辦?

對(duì)于很多沒(méi)用過(guò)的人來(lái)說(shuō),面試官問(wèn)項(xiàng)目中這些參數(shù)是怎么用?此時(shí),很容易選擇妥協(xié),傻傻的回答沒(méi)用過(guò)。

偷偷的告訴你,很多面試官也沒(méi)有用過(guò)。

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

在代碼里可以自己編造以下問(wèn)題:

內(nèi)存溢出

內(nèi)存泄漏

棧溢出

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

 

責(zé)任編輯:武曉燕 來(lái)源: Java后端技術(shù)全棧
相關(guān)推薦

2010-09-25 13:05:07

JVM參數(shù)

2010-03-04 10:56:52

JVM參數(shù)

2023-11-10 11:23:20

JVM內(nèi)存

2023-04-24 14:54:09

JVM性能調(diào)優(yōu)

2023-01-16 08:19:25

線上JVM調(diào)優(yōu)

2012-01-10 14:35:08

JavaJVM

2021-12-06 11:03:57

JVM性能調(diào)優(yōu)

2010-09-17 17:02:24

JVM參數(shù)

2017-07-21 08:55:13

TomcatJVM容器

2023-11-11 19:07:23

JVMJava

2024-05-21 09:08:57

JVM調(diào)優(yōu)面試

2022-11-30 08:17:41

JVM調(diào)優(yōu)技巧

2021-09-06 11:02:17

JVM架構(gòu)調(diào)優(yōu)

2021-03-17 11:35:11

JVM代碼Java

2010-09-26 09:08:17

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

2010-09-26 13:39:46

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

2012-01-10 15:13:56

JavaJVM

2017-10-13 15:16:38

Java服務(wù)GC參數(shù)

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2017-09-22 15:15:23

jvm調(diào)優(yōu)命令
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)