要了解GC對性能的做用,首先要了解相應的參數: html
JVM Options For GC 1: heap size
a:-Xmx
指定jvm的最大heap大小,如:-Xmx2g java
b:-Xms
指定jvm的最小heap大小,如:-Xms1g linux
c:-Xmn
指定jvm中New Generation的大小,如:-Xmn256m web
d:-XX:PermSize
指定jvm中Perm Generation的最小值,如:-XX:PermSize=32m 服務器
e:-XX:MaxPermSize
指定Perm Generation的最大值,如:-XX:MaxPermSize=64m 併發
f:-Xss
指定線程桟大小,如:-Xss128k app
g:-XX:NewRatio
指定jvm中Old Generation heap size與New Generation的比例,在使用CMS GC的狀況下此參數失效, 如:-XX:NewRatio=2 jvm
h:-XX:SurvivorRatio
指定New Generation中Eden Space與一個Survivor Space的heap size比例,-XX:SurvivorRatio=8,那麼在總共New Generation爲10m的狀況下,Eden Space爲8m 性能
i:-XX:MinHeapFreeRatio
指定jvm heap在使用率小於n的狀況下,heap進行收縮,Xmx==Xms的狀況下無效,如:-XX:MinHeapFreeRatio=30 測試
j:-XX:MaxHeapFreeRatio
指定jvm heap在使用率大於n的狀況下,heap進行擴張,Xmx==Xms的狀況下無效,如:-XX:MaxHeapFreeRatio=70
k:-XX:LargePageSizeInBytes
指定Java heap的分頁頁面大小,如:-XX:LargePageSizeInBytes=128m
2: garbage collector
a:-XX:+UseParallelGC
指定在New Generation使用parallel collector,並行收集,同時啓動多個垃圾回收thread,不能和CMS gc一塊兒使用.系統噸吐量優先,可是會有較長長時間的app pause,後臺系統任務可使用此gc
b:-XX:ParallelGCThreads
指定parallel collection時啓動的thread個數,默認是物理processor的個數,如:-xx:ParallelGCThreads=8
c:-XX:+UseParallelOldGC
指定在Old Generation使用parallel collector
d:-XX:+UseParNewGC
指定在New Generation使用parallel collector,是UseParallelGC的gc的升級版本,有更好的性能或者優勢,能夠和CMS gc一塊兒使用
e:-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC的狀況下,儘可能減小mark的時間
f:-XX:+UseConcMarkSweepGC
指定在Old Generation使用concurrent cmark sweep gc,gc thread和app thread並行,因此稱做concurrent.app pause時間較短,適合交互性強的系統,如web server
g:-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc的狀況下,防止memory fragmention,對live object進行整理,使memory碎片減小
h:-XX:CMSInitiatingOccupancyFraction=n
指示在old generation在使用了n%的比例後,啓動concurrent collector,默認值是68,如:-XX:CMSInitiatingOccupancyFraction=70
有個bug,在低版本的jvm上出現,http://bugs.sun.com/bugdatabase /view_bug.do?bug_id=6486089
i:-XX:+UseCMSInitiatingOccupancyOnly
指示只有在old generation在使用了初始化的比例後concurrent collector啓動收集
3:others
a:-XX:MaxTenuringThreshold
指定一個object在經歷了n次young gc後轉移到old generation區,在linux64的java6下默認值是15,此參數對於throughput collector無效,如:-XX:MaxTenuringThreshold=31
b:-XX:+DisableExplicitGC
禁止java程序中的full gc,如System.gc()的調用
c:-XX:+UseFastAccessorMethods
原始類型get,set方法的優化
d:-XX:+PrintGCDetails
打應垃圾收集的狀況如:
[GC 15610.466: [ParNew: 229689K->20221K(235968K), 0.0194460 secs] 1159829K->953935K(2070976K), 0.0196420 secs]
e:-XX:+PrintGCTimeStamps
打應垃圾收集的時間狀況,如:
[Times: user=0.09 sys=0.00, real=0.02 secs]
f:-XX:+PrintGCApplicationStoppedTime
打應垃圾收集時,系統的停頓時間,如:
Total time for which application threads were stopped: 0.0225920 seconds
JVM給了三種選擇:串行收集器、並行收集器、併發收集器,可是串行收集器只適用於小數據量的狀況,因此這裏的選擇主要針對並行收集器和併發收集器。默認狀況下,JDK5.0之前都是使用串行收集器,若是想使用其餘收集器須要在啓動時加入相應參數。JDK5.0之後,JVM會根據當前系統配置進行判斷。
1. 吞吐量優先的並行收集器
如上文所述,並行收集器主要以到達必定的吞吐量爲目標,適用於科學技術和後臺處理等。
典型配置:
* 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區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直打開。
2. 響應時間優先的併發收集器
如上文所述,併發收集器主要是保證系統的響應時間,減小垃圾收集時的停頓時間。適用於應用服務器、電信領域等。
典型配置:
* 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:打開對年老代的壓縮。可能會影響性能,可是能夠消除碎片
http://www.51testing.com/html/77/268377-216345.html