JVM又爆了,別傻傻只會重啟加記憶體!

  • 2019 年 10 月 30 日
  • 筆記

前提:某大型跨境電商業務發展非常快,線上機器擴容也很頻繁,但是對於線上機器的運行情況,特別是jvm記憶體的情況,一直沒有一個統一的標準來給到各個應用服務的owner。

經過618大促之後,和運維的同學討論了下,希望將線上伺服器的jvm參數標準化,可以以一個統一的方式給到各個應用,提升線上伺服器的穩定性,同時減少大家都去調整jvm參數的時間。

參考了之前在淘寶天貓工作的公司的經歷:經過大家討論,根據jdk的版本以及線上機器配置,確定了一個推薦的jvm配置:

配置說明:

1. 堆設置 o -Xms:初始堆大小 o -Xmx:最大堆大小 o -XX:NewSize=n:設置年輕代大小 o -XX:NewRatio=n:設置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4 o -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5 o -XX:MaxPermSize=n:設置持久代大小

2. 收集器設置

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

3. 垃圾回收統計資訊 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename " 4. 並行收集器設置 -XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集執行緒數。 -XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間 -XX:GCTimeRatio=n:設置垃圾回收時間占程式運行時間的百分比。公式為1/(1+n)

長期表現

第一個變化:fgc的次數減少,減少了大概一倍以上; mobile工程,調整前基本上一天1-2輛次,調整後基本上就是2-3天一次

總結:

Jvm調優這塊還是有一定難度的有時候我們會碰到下面這些問題:OutOfMemoryError,記憶體不足、記憶體泄露、執行緒死鎖、Java進程消耗CPU過高。

這些問題在日常開發容易忽視,比如有的人遇到上面的問題只是重啟伺服器或者調大記憶體,而不會深究問題根源,但能夠理解並解決這些問題是Java程式設計師進階的必備要求。

本文將對一些常用的JVM性能調優底層原理進行解析,希望能起拋磚引玉之用。