一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 美團面試:熟悉哪些JVM調優參數,幸好我準備過!

美團面試:熟悉哪些JVM調優參數,幸好我準備過!

2021-08-26 23:38Java后端技術全棧田維常 Java教程

實話實說,很多人干了三、五年的Java開發,照樣沒用使用過JVM調優參數。但是,面試官可不管你有沒有用過,面試官心里想的是“這問題回答不出來,證明你很low B,還想要那么高的薪資,沒門”。

美團面試:熟悉哪些JVM調優參數,幸好我準備過!

實話實說,很多人干了三、五年的Java開發,照樣沒用使用過JVM調優參數。

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

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

首先,看看本文主要內容:

美團面試:熟悉哪些JVM調優參數,幸好我準備過!

今天來熟悉一下,關于JVM調優常用的一些參數。

X或者XX開頭的都是非標準化參數

美團面試:熟悉哪些JVM調優參數,幸好我準備過!

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

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

-XX:+PrintCommandLineFlags查看當前JVM設置過的相關參數:

美團面試:熟悉哪些JVM調優參數,幸好我準備過!

JVM參數分類

根據JVM參數開頭可以區分參數類型,共三類:“-”、“-X”、“-XX”,

標準參數(-):所有的JVM實現都必須實現這些參數的功能,而且向后兼容;

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

非標準參數(-X):默認jvm實現這些參數的功能,但是并不保證所有jvm實現都滿足,且不保證向后兼容;

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

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

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

堆參數設置

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

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

所以在生產環境中,JVM的Xms和Xmx要設置成大小一樣的,能夠避免GC在調整堆大小帶來的不必要的壓力。

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

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

注意Survivor區有兩個,默認是8,表示:Eden:S0:S1=8:1:1

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

元空間參數

-XX:MetaspaceSize:Metaspace 空間初始大小,如果不設置的話,默認是20.79M,這個初始大小是觸發首次 Metaspace Full GC的閾值。

例如:-XX:MetaspaceSize=256M

-XX:MaxMetaspaceSize:Metaspace 最大值,默認不限制大小,但是線上環境建議設置。

例如:-XX:MaxMetaspaceSize=256M

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

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

建議將 MetaspaceSize 和 MaxMetaspaceSize設置為同樣大小,避免頻繁擴容。

棧參數設置

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

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

收集器參數設置

Serial垃圾收集器(新生代)

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

ParNew垃圾收集器(新生代)

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

Parallel Scavenge收集器(新生代)

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

ParallelOl垃圾收集器(老年代)

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

CMS垃圾收集器(老年代)

開啟 -XX:+UseConcMarkSweepGC 關閉 -XX:-UseConcMarkSweepGC

G1垃圾收集器

開啟 -XX:+UseG1GC 關閉 -XX:-UseG1GC

GC策略參數配置

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

-XX:MaxGCPauseMillis

堆占用了多少比例的時候觸發GC,就即觸發標記周期的 Java 堆占用率閾值。默認占用率是整個 Java 堆的 45%

-XX:InitiatingHeapOccupancyPercent=n

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

-XX:PretenureSizeThreshold=1000000 //

進入老年代最小的GC年齡,年輕代對象轉換為老年代對象最小年齡值,默認值7

-XX:InitialTenuringThreshol=7

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

-XX:MaxTenuringThreshold

GC并行執行線程數

-XX:ParallelGCThreads=16

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

-XX:-+DisableExplicitGC

設置吞吐量大小,默認99

XX:GCTimeRatio

打開自適應策略,各個區域的比率,晉升老年代的年齡等參數會被自動調整。以達到吞吐量,停頓時間的平衡點。

XX:UseAdaptiveSizePolicy

設置GC時間占用程序運行時間的百分比

GCTimeRatio

Dump異常快照

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath

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

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

這對于特別是對相隔數月才出現的OOM異常尤為重要。

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

-XX:OnOutOfMemoryError

表示發生OOM后,運行jconsole.exe程序。

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

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

8G內存的服務器該如何設置

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

-Xmx3500m 設置JVM最大可用內存為3550M。

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

整個堆大小=年輕代大小 + 年老代大小 + 方法區大小

-Xss128k 設置每個線程的堆棧大小。

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

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

-XX:SurvivorRatio=4 設置年輕代中Eden區與Survivor區的大小比值。

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

-XX:MaxTenuringThreshold=0 設置垃圾最大年齡。

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

項目中,GC日志配置

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

  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  

參數解釋:

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

項目中沒用過怎么辦?

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

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

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

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

內存溢出

內存泄漏

棧溢出

然后使用JVM參數進行調優,或者通過JVM工具和相關命令找到問題,然后解決問題。

原文鏈接:https://mp.weixin.qq.com/s/NjzyQaNmf1NDFSsjaJfNdQ

延伸 · 閱讀

精彩推薦
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7472021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
主站蜘蛛池模板: 欧美在线视频一区二区 | 高跟丝袜麻麻求我调教 | 女人是男人的未来1分49分 | 幸福草电视剧演员表介绍 | 亚洲精品日韩专区在线观看 | 毛片资源站 | 国产精品久久久久影视不卡 | 香蕉eeww99国产在线观看 | 日本成人黄色网址 | 免费观看一区二区 | 四虎影视免费 | 午夜大片在线观看 | 99热最新在线观看 | 国产一级真人毛爱做毛片 | 99热精品在线观看 | 日韩精品免费一区二区 | 国产另类视频 | 女黑人尺寸bbb | 亚洲欧美日韩精品久久亚洲区 | 亚洲AV国产福利精品在现观看 | 亚洲天堂精品视频 | 国产成人精视频在线观看免费 | 暖暖 免费 高清 日本 在线1 | 日本精工厂网址 | 无人视频在线观看完整版高清 | 欧美一区二区三区视视频 | 欧美日韩国产最新一区二区 | 日本人成动漫网站在线观看 | 77色视频在线 | 男人添女人 | 高清女主播一区二区三区 | 好男人好资源在线观看免费 | 免费看黄色片网站 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 日本在线亚州精品视频在线 | 猫咪色网| 无耻三级在线观看 | 忘忧草秋观看未满十八 | 日本一区视频在线 | 精品国语国产在线对白 | 国产成人精品视频一区 |