JVM之關鍵參數
=============================================================
JVM關鍵參數
=============================================================
本文列出來JVM的一些關鍵參數及使用方法,主要包括了Heap堆基礎參數,Heap堆的動態調整參數,新生代內存參數,永久代內存參數,JVM線程設置參數,各個垃圾回收器關鍵參數,codecache關鍵參數。本章末尾有思維導圖,可參考。
-------------------------------------------------------------
一、Heap堆的大小
-------------------------------------------------------------
1.1 Xmx 堆內存最大使用內存。使用方法: -Xmx___
1.2 Xms 堆內存最小使用內存。使用方法 -Xms___
1.3 MaxHeapSize Xmx等價于MaxHeapSize。使用方法:-XX:MaxHeapSize=___
1.4 InitialHeapSize Xms等價于InitialHeapSize。使用方法:-XX:InitialHeapSize=___
-------------------------------------------------------------
二、Heap堆的動態調整
-------------------------------------------------------------
2.1 Xminf 指定了 jvm heap 在使用率小于 n 的情況下 ,heap 進行收縮 ,Xmx==Xms 的情況下無效。使用方法:-Xminf___
2.2 Xmaxf 指定了 jvm heap 在使用率大于 n 的情況下 ,heap 進行收縮 ,Xmx==Xms 的情況下無效。使用方法:-Xmaxf___
2.3 MinHeapFreeRatio Xminf等價于MinHeapFreeRatio。使用方法:-XX:MinHeapFreeRatio=___
2.4 MaxHeapFreeRatio Xmaxf等價于MaxHeapFreeRatio。使用方法:-XX:MaxHeapFreeRatio=___
2.5 MinHeapDeltaBytes 表示當我們要擴容或者縮容的時候,決定是否要做或者嘗試擴容的時候最小擴/縮多少,默認為192K。使用G1時,在當新生代無法存儲新創建的對象時,會先做一次擴容,擴容大小就是MinHeapDeltaBytes的值,如果還存不下就做GC。使用方法:-XX:MinHeapDeltaBytes=___
tip:
1.指定 jvm heap 在使用率小于 n 的情況下 ,heap 進行收縮 ,Xmx==Xms 的情況下無效
2.默認大小40/70 PS收集器 自適應模式0/100
3.這兩個值只作用于G1收集器,其他收集器只作用于老年代
4.CMS-GC如果沒有指定老年代固定使用率觸發CMS GC的閾值,那么MinHeapFreeSize會配合CMSTriggerRatio參數計算出觸發CMS-GC的閾值(92%)
-------------------------------------------------------------
三、NewSize
-------------------------------------------------------------
3.1 Xmn 參數等價于同時設置了NewSize和MaxNewSize,并且值都相等,例如-Xmn128M,等同于-XX:NewSize=128M -XX:MaxNewSize=128M
3.2 NewSize 設置新生代有效內存的初始化大小,也可以說是新生代有效內存的最小值,當新生代回收之后有效內存可能會進行縮容,這個參數就指定了能縮小到的最小值。使用方法:-XX:NewSize=___
3.3 MaxNewSize 設置新生代有效內存的最大值,當對新生代進行回收之后可能會對新生代的有效內存進行擴容,那到底能擴容到多大。使用方法:-XX:MaxNewSize=___
3.4 NewRatio 當前老生代可用內存/當前新生代可用內存的比值,默認是2。使用方法:XX:NewRatio=___
tip:
1.每次新生代有效內存大小調整之后,新生代的幾個組成部分也會重新調整位置,包括Eden,From和To三塊內存的起止位置
2.NewRatio 如果新生代被回收之后,其有效內存可以進行調整的話,會根據此時老生代的有效內存和NewRatio等條件計算出新生代有效內存的變化值來進行擴容或者縮容;G1-GC下不建議設置新生代這些參數,盡量自適應,GC效率會更高,這也是官方推薦的
3.5 新生代組成:Eden + from space + to space
3.5.1 SurvivorRatio:Eden/一個Survivor的比值,默認是8,最小值為1。CMS-GC下如果MaxTenuringThreshold設置為0,相當于每次GC都直接晉升到老生代,此時如果SurvivorRatio沒有設置的話,會將SurvivorRatio默認設置為1024。使用方法:-XX:SurvivorRatio=___
3.5.2 InitialSurvivorRatio 新生代初始可用內存與survivor的比值,默認情況下InitialSurvivorRatio為8,那表示From和To各自占整個新生代的1/8,而Eden占(1-2*1/8=3/4),并且只在啟動的時候有用。使用方法:-XX:InitialSurvivorRatio=___
tip:
1.InitialSurvivorRatio不能比3小,至少是3,否則會被JVM自動調整為3,MinSurvivorRatio也是一樣的
2.如果我們JVM參數里設置過SurvivorRatio,但是沒有設置InitialSurvivorRatio,那么InitialSurvivorRatio的值會被默認設置為SurvivorRatio+2
3.InitialSurvivorRatio只針對PS GC算法有用
-------------------------------------------------------------
四、Perm Size(JDK1.7及之前版本)
-------------------------------------------------------------
4.1 PermSize Perm內存初始值的大小,也是最小值(初始值21757952bite)。使用方法:-XX:PermSize=___
4.2 MaxPermSize Perm內存的最大值,Perm空間的可用大小會在PermSize和MaxPermSize之間動態變化。使用方法:-XX:MaxPermSize=___
tip:
1.PermSize比MaxPermSize大,那么會將MaxPermSize設置為PermSize
2.PermSize按照64K對齊,而MaxPermSize按照2M對齊
3.真正可用的Perm邊界的值并不一定是按照上面的值對齊好后的值,PS-GC下,PermSize最終會按照512K對齊,但是jinfo看到的PermSize的值還是原來計算的64K對齊的值,CMS-GC下就按照64K對齊
4.PermSize必須不小于1M
5.Class對象默認情況下是存在Heap里,如果我們設置了-XX:+UnlockDiagnosticVMOptions -XX:+JavaObjectsInPerm這兩個參數,那將分配在Perm里
-------------------------------------------------------------
五、Metaspace(JDK1.7版本以上,代替了Perm Size)
-------------------------------------------------------------
5.1 -XX:MetaspaceSize=___
5.2 CompressedClassSpaceSize JVM啟動的時候會專門分配一塊內存,大小是CompressedClassSpaceSize,正常情況會類似Perm一樣挨著Heap分配,這塊內存專門來存類元數據的klass部分( UseCompressedClassPointers未開啟,CompressedClassSpaceSize參數沒有效果)。使用方法:-XX:CompressedClassSpaceSize=___
5.3 InitialBootClassLoaderMetaspaceSize InitialBootClassLoaderMetaspaceSize主要指定BootClassLoader的存儲非klass部分的數據的。使用方法:-XX:InitialBootClassLoaderMetaspaceSize=___
tip:
1.Metaspace如果類加載器很多的時候,最大的問題就是碎片化的問題
2.jstat看到的Metaspace內存的使用率,分母是committed的size,而不是整個Reserved的內存
-------------------------------------------------------------
六、Thread Size(在JVM里大概可以分為兩類線程,Java線程和非Java線程,比如GC線程這些都屬于非Java線程,在JVM里還有一個VMThread,這個也是非Java線程)
-------------------------------------------------------------
6.1 Xss JAVA線程棧大小 Xss和ThreadStackSize是等價的(-Xss100K等價于-XX:ThreadStackSize=100) ThreadStackSize的值64位os下默認是1M,最小值是228k
6.2 VMThreadStackSize JVM線程棧大小 64位os下默認大小為4M,32位下默認位2M
6.3 CompilerThreadStackSize 設置編譯線程棧的大?。?4位os下默認大小為4M,32位下默認位2M)
-------------------------------------------------------------
七、垃圾回收器
-------------------------------------------------------------
7.1 G1 使用G1垃圾回收器:-XX:+UseG1GC
7.1.1 -XX:MaxGCPauseMillis 目標(GC)最大停頓時間,設置之后G1會自動調整相關參數試圖達到此目標。使用方法:-XX:MaxGCPauseMillis=___(默認200ms)
7.1.2 -XX:ParallelGCThreads 并行回收時GC的工作線程數量。默認是2,8核以上是8+((cpu-8)*5)/8。使用方法:-XX:ParallelGCThreads=___
7.1.3 -XX:InitiatingHeapOccupancyPercent 指定整個堆使用率達到多少時觸發并發標記周期(默認45)。使用方法:-XX:InitiatingHeapOccupancyPercent=___
7.2 CMS收集器 開啟CMS回收器 -XX:+UseConcMarkSweepGC
7.2.1 -XX:ConcGCThreads 并發線程數量,默認ConcGCThreads = (ParallelGCThreads + 3)/4。使用方法:-XX:ConcGCThreads=___
7.2.2 -XX:CMSInitiatingOccupancyFraction 觸發老年代GC百分比。老年代增長緩慢可以調大,可以降低CMS觸發頻率;老年代增長快可以調小,以避免頻繁觸發老年代串行回收器。默認68(CMS回收時若出現內存不足,則CMS回收失敗,強制觸發老年代串行回收器)
,若要使用必須加上-XX:+UseCMSInitiatingOccupancyOnly。使用方法:-XX:CMSInitiatingOccupancyFraction=___
7.2.3 -XX:CMSFullGCsBEforeCompaction 設定多少次CMS回收后進行一次內存壓縮。使用方法:-XX:CMSFullGCsBeforeCompaction=___
7.2.4 -XX:CMSClassUnloadingEnabled Whether class unloading enabled when using CMS GC(Perm)。使用方法:-XX:+CMSClassUnloadingEnabled
7.3 PS收集器
7.3.1 -XX:GCTimeRatio 吞吐量大小,若值為n,那么系統將花費不超過1/(1+n)的時間進行垃圾回收(默認99)。使用方法:-XX:GCTimeRatio=___
7.3.2 -XX:UseAdaptiveSizePolicy 自適應策略,僅指定最大堆、目標吞吐量和最大停頓時間。使用方法:-XX:+UseAdaptiveSizePolicy
-------------------------------------------------------------
八、Codecache
-------------------------------------------------------------
8.1 InitialCodeCacheSize 初始CodeCacheSize大小(默認值2555904bytes)
8.2 ReservedCodeCacheSize 最大CodeCacheSize大?。J值JDK-750331648、JDK8-251658240)
8.3 Xmaxjitcodesize與ReservedCodeCacheSize等價
8.4 CodeCacheMinimumFreeSpace 當CodeCache的可用大小不足這個值的時候,就會進行code cache full的處理。默認值(512000)

轉載請注明出處,商用請征得作者本人同意,謝謝?。?!
浙公網安備 33010602011771號