"簡單"的jvm調優

    做爲一名勵志成爲"神奇寶貝大師"的男人,怎麼能連JVM都不懂呢,否則你可能會像智爺那樣,一生拿不到冠軍了。
    java能在多平臺運行的基礎就是java虛擬機了,這邊咱們不談論它的內存區域,畢竟jdk7的方法區和jdk8元空間仍是有區別的。

jvm參數

//常見參數
-Xms1024m 初始堆大小 
-Xmx1024m 最大堆大小  通常將xms和xmx設置爲相同大小,防止堆擴展,影響性能。
-XX:NewSize=n:設置年輕代大小 
-XX:NewRatio=n:設置年輕代和年老代的比值.如:爲3,表示年輕代與年老代比值爲1:3,年輕代佔整個年輕代年老代和的1/4 
-XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值.注意Survivor區有兩個.如:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5 
-XX:MaxPermSize=n:設置持久代大小
-XX:+HeapDumpOnOutOfMemoryError OOM時自動保存堆文件,能夠用visualvm分析堆文件

//收集器設置 
-XX:+UseSerialGC:設置串行收集器 
-XX:+UseParallelGC:設置並行收集器 
-XX:+UseParalledlOldGC:設置並行年老代收集器 
-XX:+UseConcMarkSweepGC:設置併發收集器

//垃圾回收統計信息 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-Xloggc:filename

//並行收集器設置 
-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數.並行收集//線程數. 
-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間 
-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比.公式爲1/(1+n)
//併發收集器設置 
-XX:+CMSIncrementalMode:設置爲增量模式.適用於單CPU狀況. 
-XX:ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數.並行收集線程數.
複製代碼

用法

Idea用法
  1. 打開idea
  2. 點擊右上角 edit configurations
  3. 在vm options輸入參數

Springboot用法

因爲筆者一直用的是Springboot,所以這邊以Springboot的形式進行示範,在啓動項目jar包時添加參數。java

java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-1.0.0.jar
複製代碼

工具使用

Visual VM

Visual VM 由java編寫,已經被jdk集成,經過檢測 JVM 中加載的類和對象信息等幫助咱們分析內存使用狀況,是用來分析java項目 、調優的利器,功能強大。git

概述:顯示了項目的jvm參數。
這邊的禁用是什麼緣由呢?相信直播間的觀衆應該都是有智慧的!
監視: {} 暫時省略n個字。
線程: {} 暫時省略n個字。
抽樣器: {} 暫時省略n個字。

jstat

1. 查看項目進程PId
  1. 筆者這邊採用docker部署Springboot項目,因此只須要top或者jps就能直接查看到Pid。
  2. lsof -i:端口號,前提是你已經安裝了。
  3. ps -ef | grep 項目名
2. 使用命令查看結果
jstat -gcutil 5 1000
複製代碼

實戰分析

  1. 經過Visual VM發現,基本上每隔8分鐘,jvm就會發生一次GC,而我本人也沒有訪問過項目,項目的訪問量應該爲0,因此在沒有定時任務或者死循環的狀況下,產生的對象數應該爲0。理論上是不會發生GC的。
  2. 那麼GC是發生在哪裏的呢?年輕代仍是老年代?
    因爲這邊NewRatio 爲1,因此無論是老年代或者新生代發生gc通常都是在200m左右,咱們很差分辨是哪一個代。其實以前NewRatio=2xmx450m,發生GC的狀況是150m。所以是新生代發生了GC。
  3. 若是不相信,下面是用jstat的截圖,能夠看出是新生代對象在不停的產生。

4. 知道是新生代發生了GC,基本上已經證實了上述的猜測:有個死循環。經過抽象分析器發現char對象很是大。

5. 接下來能夠經過堆dump發現是哪幾句代碼出現了問題。可使用 jhat這個工具,文件能夠經過Visual VM產生,固然在OOM的狀況下,也能夠經過參數產生。

jhat -J-Xmx1024M file
複製代碼

分析堆dump應該就能夠發現了,這邊就不分析了,實際上是重啓項目,映射多個端口,而後等待GC,就比較麻煩。爲了更加貼近實際,該項目屬於真實項目,已部署到阿里雲,連接在此,猛戳我,代碼來源於github。github

結語

最後祝你們新年快樂,找到好工做。但願小智能拿個冠軍,都看了十幾年了,圓了老玩家的夢吧。docker

相關文章
相關標籤/搜索