java-xx引數介紹及調優總結
阿新 • • 發佈:2018-11-28
功能開關:
引數 | 預設值或限制 | 說明 |
---|---|---|
引數 | 預設值 | 功能 |
-XX:-AllowUserSignalHandlers | 限於Linux和Solaris,預設不啟用 | 允許為java程序安裝訊號處理器,訊號處理參見類:sun.misc.Signal, sun.misc.SignalHandler |
-XX:+DisableExplicitGC | 預設啟用 | 禁止在執行期顯式地呼叫System.gc() |
-XX:+FailOverToOldVerifier | Java6新引入選項,預設啟用 | 如果新的Class校驗器檢查失敗,則使用老的校驗器(失敗原因:因為JDK6最高向下相容到JDK1.2,而JDK1.2的class info 與JDK6的info存在較大的差異,所以新校驗器可能會出現校驗失敗的情況) |
-XX:+HandlePromotionFailure | java5以前是預設不啟用,java6預設啟用 | 關閉新生代收集擔保 |
-XX:+MaxFDLimit | 限於Solaris,預設啟用 | 設定java程序可用檔案描述符為作業系統允許的最大值。 |
-XX:PreBlockSpin=10 | -XX:+UseSpinning 必須先啟用,對於java6來說已經預設啟用了,這裡預設自旋10次 | 控制多執行緒自旋鎖優化的自旋次數 |
-XX:-RelaxAccessControlCheck | 預設不啟用 | 在Class校驗器中,放鬆對訪問控制的檢查,作用與reflection裡的setAccessible類似 |
-XX:+ScavengeBeforeFullGC | 預設啟用 | 在Full GC前觸發一次Minor GC |
-XX:+UseAltSigs | 限於Solaris,預設啟用 | 為了防止與其他傳送訊號的應用程式衝突,允許使用候補訊號替代 SIGUSR1和SIGUSR2 |
-XX:+UseBoundThreads | 限於Solaris, 預設啟用 | 繫結所有的使用者執行緒到核心執行緒, 減少執行緒進入飢餓狀態(得不到任何cpu time)的次數 |
-XX:-UseConcMarkSweepGC | 預設不啟用 | 啟用CMS低停頓垃圾收集器,減少FGC的暫停時間 |
-XX:+UseGCOverheadLimit | 預設啟用 | 限制GC的執行時間。如果GC耗時過長,就拋OOM |
-XX:+UseLWPSynchronization | 限於solaris,預設啟用 | 使用輕量級程序(核心執行緒)替換執行緒同步 |
-XX:-UseParallelGC | -server時啟用,其他情況下,預設不啟用 | 策略為新生代使用並行清除,年老代使用單執行緒Mark-Sweep-Compact的垃圾收集器 |
-XX:-UseParallelOldGC | 預設不啟用 | 策略為老年代和新生代都使用並行清除的垃圾收集器 |
-XX:-UseSerialGC | -client時啟用,其他情況下,預設不啟用 | 使用序列垃圾收集器 |
-XX:-UseSpinning | java1.4.2和1.5需要手動啟用, java6預設已啟用 | 啟用多執行緒自旋鎖優化 |
-XX:+UseTLAB | 1.4.2以前和使用-client選項時,預設不啟用,其餘版本預設啟用 | 啟用執行緒本地快取區 |
-XX:+UseSplitVerifier | java5預設不啟用, java6預設啟用 | 使用新的Class型別校驗器 |
-XX:+UseThreadPriorities | 預設啟用 | 使用本地執行緒的優先順序 |
-XX:+UseVMInterruptibleIO | 限於solaris,預設啟用 | 在solaris中,允許執行時中斷執行緒 |
效能引數:
引數 | 預設值或限制 | 說明 |
---|---|---|
-XX:+AggressiveOpts | JDK 5 update 6後引入,但需要手動啟用, JDK6預設啟用 | 啟用JVM開發團隊最新的調優成果。例如編譯優化,偏向鎖,並行年老代收集等 |
-XX:CompileThreshold=10000 | 1000 | 通過JIT編譯器,將方法編譯成機器碼的觸發閥值,可以理解為呼叫方法的次數,例如調1000次,將方法編譯為機器碼 |
-XX:LargePageSizeInBytes=4m | 預設4m, amd64位:2m | 設定堆記憶體的記憶體頁大小 |
-XX:MaxHeapFreeRatio=70 | 70 | GC後,如果發現空閒堆記憶體佔到整個預估上限值的70%,則收縮預估上限值 |
-XX:MaxNewSize=size | 1.3.1 Sparc: 32m, 1.3.1 x86: 2.5m | 新生代佔整個堆記憶體的最大值 |
-XX:MaxPermSize=64m | 5.0以後: 64 bit VMs會增大預設值的30%, 1.4 amd64: 96m, 1.3.1 -client: 32m, 其他預設 64m | Perm(俗稱方法區)佔整個堆記憶體的最大值 |
-XX:MinHeapFreeRatio=40 | 40 | GC後,如果發現空閒堆記憶體佔到整個預估上限值的40%,則增大上限值 |
-XX:NewRatio=2 | Sparc -client: 8, x86 -server: 8, x86 -client: 12, -client: 4 (1.3), 8 (1.3.1+), x86: 12, 其他預設 2 |
新生代和年老代的堆記憶體佔用比例, 例如2表示新生代佔年老代的1/2,佔整個堆記憶體的1/3 |
-XX:NewSize=2.125m | 5.0以後: 64 bit Vms 會增大預設值的30%, x86: 1m, x86, 5.0以後: 640k, 其他預設 2.125m | 新生代預估上限的預設值 |
-XX:ReservedCodeCacheSize=32m | Solaris 64-bit, amd64, -server x86: 48m, 1.5.0_06之前, Solaris 64-bit amd64: 1024m, 其他預設 32m | 設定程式碼快取的最大值,編譯時用 |
-XX:SurvivorRatio=8 | Solaris amd64: 6, Sparc in 1.3.1: 25, Solaris platforms 5.0以前: 32, 其他預設 8 | Eden與Survivor的佔用比例。例如8表示,一個survivor區佔用 1/8 的Eden記憶體,即1/10的新生代記憶體,為什麼不是1/9? 因為我們的新生代有2個survivor,即S0和S1。所以survivor總共是佔用新生代記憶體的 2/10,Eden與新生代的佔比則為 8/10 |
-XX:TargetSurvivorRatio=50 | 50 | 實際使用的survivor空間大小佔比。預設是50%,最高90% |
-XX:ThreadStackSize=512 | Sparc: 512, Solaris x86: 320 (5.0以前 256), Sparc 64 bit: 1024, Linux amd64: 1024 (5.0 以前 0), 其他預設 512. | 執行緒堆疊大小 |
-XX:+UseBiasedLocking | JDK 5 update 6後引入,但需要手動啟用, JDK6預設啟用 | 啟用偏向鎖 |
-XX:+UseFastAccessorMethods | 預設啟用 | 優化原始型別的getter方法效能(get/set:Primitive Type) |
-XX:-UseISM | 預設啟用 | 啟用solaris的ISM |
-XX:+UseLargePages | JDK 5 update 5後引入,但需要手動啟用, JDK6預設啟用 | 啟用大記憶體分頁 |
-XX:+UseMPSS | 1.4.1 之前: 不啟用, 其餘版本預設啟用 | 啟用solaris的MPSS,不能與ISM同時使用 |
-XX:+UseStringCache | 預設開啟 | 啟用快取常用的字串。 |
-XX:AllocatePrefetchLines=1 | 1 | Number of cache lines to load after the last object allocation using prefetch instructions generated in JIT compiled code. Default values are 1 if the last allocated object was an instance and 3 if it was an array. |
-XX:AllocatePrefetchStyle=1 | 1 | Generated code style for prefetch instructions. 0 – no prefetch instructions are generate*d*, 1 – execute prefetch instructions after each allocation, 2 – use TLAB allocation watermark pointer to gate when prefetch instructions are executed. |
-XX:+UseCompressedStrings | Java 6 update 21有一選項 | 其中,對於不需要16位字元的字串,可以使用byte[] 而非char[]。對於許多應用,這可以節省記憶體,但速度較慢(5%-10%) |
-XX:+OptimizeStringConcat | 在Java 6更新20中引入 | 優化字串連線操作在可能的情況下 |
除錯引數:
引數 | 預設值或限制 | 說明 |
---|---|---|
-XX:-CITime | 打印發費在JIT編譯上的時間 | |
-XX:ErrorFile=./hs_err_pid<pid>.log | JDK6中引入 | 錯誤檔案 |
-XX:-ExtendedDTraceProbes | JDK6中引入僅在Solaris | 啟用效能的影響DTrace探測器 |
-XX:HeapDumpPath=./java_pid<pid>.hprof | 1.4.2 update 12, 5.0 update 7 | 指定HeapDump的檔案路徑或目錄 |
-XX:-HeapDumpOnOutOfMemoryError | 1.4.2 update 12, 5.0 update 7 | 當丟擲OOM時進行HeapDump |
-XX:OnError=”<cmd args>;<cmd args>” | 1.4.2 update 9 | 當發生錯誤時執行使用者指定的命令 |
-XX:OnOutOfMemoryError=”<cmd args>; <cmd args>” |
1.4.2 update 12, 6 | 當發生OOM時執行使用者指定的命令 |
-XX:-PrintClassHistogram | 1.4.2 | 當Ctrl+Break發生時列印Class例項資訊,與jmap -histo相同 |
-XX:-PrintConcurrentLocks | 6 | 當Ctrl+Break發生時列印java.util.concurrent的鎖資訊, 與jstack -l相同 |
-XX:-PrintCommandLineFlags | 5 | 列印命令列上的標記 |
-XX:-PrintCompilation | 當方法被編譯時列印資訊 | |
-XX:-PrintGC | 當GC發生時列印資訊 | |
-XX:-PrintGCDetails | 1.4.0 | 列印GC詳細資訊 |
-XX:-PrintGCTimeStamps | 1.4.0 | 列印GC用時 |
-XX:-PrintTenuringDistribution | 列印Tenuring年齡資訊 | |
-XX:-TraceClassLoading | 跟蹤類載入 | |
-XX:-TraceClassLoadingPreorder | 1.4.2 | 跟蹤所有載入的引用類 |
-XX:-TraceClassResolution | 1.4.2 | 跟蹤常量池的變化 |
-XX:-TraceClassUnloading | 跟蹤類的解除安裝 | |
-XX:-TraceLoaderConstraints | 6 | Trace recording of loader constraints |
-XX:+PerfSaveDataToFile | 退出時儲存jvmstat二進位制檔案 | |
-XX:ParallelGCThreads= | 設定新生代與老年代並行垃圾回收器的執行緒數 | |
-XX:+UseCompressedOops | Enables the use of compressed pointers (object references represented as 32 bit offsets instead of 64-bit pointers) for optimized 64-bit performance with Java heap sizes less than 32gb. | |
-XX:+AlwaysPreTouch | Pre-touch the Java heap during JVM initialization. Every page of the heap is thus demand-zeroed during initialization rather than incrementally during application execution. | |
-XX:AllocatePrefetchDistance= | Sets the prefetch distance for object allocation. Memory about to be written with the value of new objects is prefetched into cache at this distance (in bytes) beyond the address of the last allocated object. Each Java thread has its own allocation point. The default value varies with the platform on which the JVM is running. | |
-XX:InlineSmallCode= | 當編譯的程式碼小於指定的值時,內聯編譯的程式碼 | |
-XX:MaxInlineSize=35 | 內聯方法的最大位元組數 | |
-XX:FreqInlineSize= | 內聯頻繁執行的方法的最大位元組碼大小 | |
-XX:LoopUnrollLimit= | Unroll loop bodies with server compiler intermediate representation node count less than this value. The limit used by the server compiler is a function of this value, not the actual value. The default value varies with the platform on which the JVM is running. | |
-XX:InitialTenuringThreshold=7 | 設定初始的物件在新生代中最大存活次數 | |
-XX:MaxTenuringThreshold= | 設定物件在新生代中最大的存活次數,最大值15,並行回收機制預設為15,CMS預設為4 |
https://www.cnblogs.com/langtianya/p/3898760.html
https://www.cnblogs.com/langtianya/p/3898657.html
首先介紹一下新生代、老年代。所謂的新生代和老年代是針對於分代收集演算法來定義的,新生代又分為Eden和Survivor兩個區。加上老年代就這三個區。資料會首先分配到Eden區 當中(當然也有特殊情況,如果是大物件那麼會直接放入到老年代(大物件是指需要大量連續記憶體空間的java物件)。),當Eden沒有足夠空間的時候就會 觸發jvm發起一次Minor GC。如果物件經過一次Minor GC還存活,並且又能被Survivor空間接受,那麼將被移動到Survivor空 間當中。並將其年齡設為1,物件在Survivor每熬過一次Minor GC,年齡就加1,當年齡達到一定的程度(預設為15)時,就會被晉升到老年代 中了,當然晉升老年代的年齡是可以設定的。
- 堆大小設定
JVM 中最大堆大小有三方面限制:相關作業系統的資料模型(32-bt還是64-bit)限制;系統的可用虛擬記憶體限制;系統的可用實體記憶體限制。32位系統下,一般限制在1.5G~2G;64為作業系統對記憶體無限制。我在Windows Server 2003 系統,3.5G實體記憶體,JDK5.0下測試,最大可設定為1478m。
典型設定:- java -Xmx3550m -Xms3550m -Xmn2g-Xss128k。下面進行解釋:
-Xmx3550m:設定JVM最大可用記憶體為3550M。
-Xms3550m:設定JVM最小記憶體為3550m。此值可以設定與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體。
-Xmn2g:設定年輕代大小為2G。整個JVM記憶體大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代後,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
-Xss128k:設定每個執行緒的堆疊大小。JDK5.0以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K。更具應用的執行緒所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能生成更多的執行緒。但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右。 - java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0。下面進行解釋:
-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區進行多次複製,這樣可以增加物件在年輕代的存活時間,增加在年輕代即被回收的概論。
- java -Xmx3550m -Xms3550m -Xmn2g-Xss128k。下面進行解釋:
- 回收器選擇
JVM給了三種選擇:序列收集器、並行收集器、併發收集器,但是序列收集器只適用於小資料量的情況,所以這裡的選擇主要針對並行收集器和併發收集器。預設情況下,JDK5.0以前都是使用序列收集器,如果想使用其他收集器需要在啟動時加入相應引數。JDK5.0以後,JVM會根據當前系統配置進行判斷。- 吞吐量優先的並行收集器
如上文所述,並行收集器主要以到達一定的吞吐量為目標,適用於科學技術和後臺處理等。
典型配置:- java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC:選擇垃圾收集器為並行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用併發收集,而年老代仍舊使用序列收集。
-XX:ParallelGCThreads=20:配置並行收集器的執行緒數,即:同時多少個執行緒一起進行垃圾回收。此值最好配置與處理器數目相等。 - java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式為並行收集。JDK6.0支援對年老代並行收集。 - java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:設定每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值。 - java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy:設定此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直開啟。
- java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
- 響應時間優先的併發收集器
如上文所述,併發收集器主要是保證系統的響應時間,減少垃圾收集時的停頓時間。適用於應用伺服器、電信領域等。
典型配置:- java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:設定年老代為併發收集。測試中配置這個以後,-XX:NewRatio=4的配置失效了,原因不明。所以,此時年輕代大小最好用-Xmn設定。
-XX:+UseParNewGC:設定年輕代為並行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設定,所以無需再設定此值。 - java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由於併發收集器不對記憶體空間進行壓縮、整理,所以執行一段時間以後會產生“碎片”,使得執行效率降低。此值設定執行多少次GC以後對記憶體空間進行壓縮、整理。
-XX:+UseCMSCompactAtFullCollection:開啟對年老代的壓縮。可能會影響效能,但是可以消除碎片
- java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
- 吞吐量優先的並行收集器
- 輔助資訊
JVM提供了大量命令列引數,列印資訊,供除錯使用。主要有以下一些:- -XX:+PrintGC
輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs][Full GC 121376K->10414K(130112K), 0.0650971 secs]
- -XX:+PrintGCDetails
輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs][GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
- -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可與上面兩個混合使用
輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] - -XX:+PrintGCApplicationConcurrentTime:列印每次垃圾回收前,程式未中斷的執行時間。可與上面混合使用
輸出形式:Application time: 0.5291524 seconds - -XX:+PrintGCApplicationStoppedTime:列印垃圾回收期間程式暫停的時間。可與上面混合使用
輸出形式:Total time for which application threads were stopped: 0.0468229 seconds - -XX:PrintHeapAtGC:列印GC前後的詳細堆疊資訊
輸出形式:
34.702: [GC {Heap before gc invocations=7:
def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000)
tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
}
, 0.0757599 secs] - -Xloggc:filename:與上面幾個配合使用,把相關日誌資訊記錄到檔案以便分析。
- -XX:+PrintGC
- 常見配置彙總
- 堆設定
- -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數。並行收集執行緒數。
- 堆設定
- 四、調優總結
- 年輕代大小選擇
- 響應時間優先的應用:儘可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的物件。
- 吞吐量優先的應用:儘可能的設定大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用。
- 年老代大小選擇
- 響應時間優先的應用:年老代使用併發收集器,所以其大小需要小心設定,一般要考慮併發會話率和會話持續時間等一些引數。如果堆設定小了,可以會造成記憶體碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最優化的方案,一般需要參考以下資料獲得:
- 併發垃圾收集資訊
- 持久代併發收集次數
- 傳統GC資訊
- 花在年輕代和年老代回收上的時間比例
- 吞吐量優先的應用:一般吞吐量優先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以儘可能回收掉大部分短期物件,減少中期的物件,而年老代盡存放長期存活物件。
- 響應時間優先的應用:年老代使用併發收集器,所以其大小需要小心設定,一般要考慮併發會話率和會話持續時間等一些引數。如果堆設定小了,可以會造成記憶體碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。最優化的方案,一般需要參考以下資料獲得:
- 較小堆引起的碎片問題
因為年老代的併發收集器使用標記、清除演算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合併,這樣可以分配給較大的物件。但是,當堆空間較小時,執行一段時間以後,就會出現“碎片”,如果併發收集器找不到足夠的空間,那麼併發收集器將會停止,然後使用傳統的標記、清除方式進行回收。如果出現“碎片”,可能需要進行如下配置:- -XX:+UseCMSCompactAtFullCollection:使用併發收集器時,開啟對年老代的壓縮。
- -XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這裡設定多少次Full GC後,對年老代進行壓縮
- -XX:MaxHeapFreeRatio=30
- 年輕代大小選擇