背景:jvm實際調優在面試時候常常被問到,因此有必要認真總結一番。html
轉自:JVM原理講解和調優面試
4、JVM內存調優數組
首先須要注意的是在對JVM內存調優的時候不能只看操做系統級別Java進程所佔用的內存,這個數值不能準確的反應堆內存的真實佔用狀況,由於GC事後這個值是不會變化的,所以內存調優的時候要更多地使用JDK提供的內存查看工具,好比JConsole和Java VisualVM。併發
對JVM內存的系統級的調優主要的目的是減小GC的頻率和Full GC的次數,過多的GC和Full GC是會佔用不少的系統資源(主要是CPU),影響系統的吞吐量。特別要關注Full GC,由於它會對整個堆進行整理,致使Full GC通常因爲如下幾種狀況:jvm
舊生代空間不足
調優時儘可能讓對象在新生代GC時被回收、讓對象在新生代多存活一段時間和不要建立過大的對象及數組避免直接在舊生代建立對象 工具
Pemanet Generation空間不足
增大Perm Gen空間,避免太多靜態對象 spa
統計獲得的GC後晉升到舊生代的平均大小大於舊生代剩餘空間
控制好新生代和舊生代的比例 操作系統
System.gc()被顯示調用
垃圾回收不要手動觸發,儘可能依靠JVM自身的機制 線程
調優手段主要是經過控制堆內存的各個部分的比例和GC策略來實現,下面來看看各部分比例不良設置會致使什麼後果htm
1)新生代設置太小
一是新生代GC次數很是頻繁,增大系統消耗;二是致使大對象直接進入舊生代,佔據了舊生代剩餘空間,誘發Full GC
2)新生代設置過大
一是新生代設置過大會致使舊生代太小(堆總量必定),從而誘發Full GC;二是新生代GC耗時大幅度增長
通常說來新生代佔整個堆1/3比較合適
3)Survivor設置太小
致使對象從eden直接到達舊生代,下降了在新生代的存活時間
4)Survivor設置過大
致使eden太小,增長了GC頻率
另外,經過-XX:MaxTenuringThreshold=n來控制新生代存活時間,儘可能讓對象在新生代被回收
由內存管理和垃圾回收可知新生代和舊生代都有多種GC策略和組合搭配,選擇這些策略對於咱們這些開發人員是個難題,JVM提供兩種較爲簡單的GC策略的設置方式
1)吞吐量優先
JVM以吞吐量爲指標,自行選擇相應的GC策略及控制新生代與舊生代的大小比例,來達到吞吐量指標。這個值可由-XX:GCTimeRatio=n來設置
2)暫停時間優先
JVM以暫停時間爲指標,自行選擇相應的GC策略及控制新生代與舊生代的大小比例,儘可能保證每次GC形成的應用中止時間都在指定的數值範圍內完成。這個值可由-XX:MaxGCPauseRatio=n來設置
最後彙總一下JVM常見配置
堆設置
-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:+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數。並行收集線程數。