1. 程式人生 > >JVM常用引數

JVM常用引數

JVM中最大堆大小有三方面限制:

1.相關作業系統的資料模型(32-bit還是64-bit)限制。

2.系統的可用虛擬記憶體限制。

3.系統的可用實體記憶體限制。

注:32-bit的系統一般限制在1.5G~2G;64-bit的 系統對記憶體無限制。

典型設定:

-Xmx3550m -Xms3550m -Xmn2g -Xss128k
-Xmx3550m:設定JVM最大可用記憶體為3550MB。

-Xms3550m:設定JVM最小可用記憶體為3550MB(這個值建議設定成與-Xmx相同,以避免每次垃圾回收完成後JVM重新分配記憶體)。

-Xmn2g:設定年輕帶大小為2G,整個堆大小=年輕代大小+年老代大小+持久代大小,持久代一般固定大小為64MB,所以增大年輕代後,將會減小年老代大小,此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。

-Xss128k:設定每個執行緒的堆疊大小.JDK5.0以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K.更具應用的執行緒所需記憶體大小進行 調整.在相同實體記憶體下,減小這個值能生成更多的執行緒.但是作業系統對一個程序內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右. 

-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:MaxTenuringThreshold=0: 設定垃圾最大年齡.如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代. 對於年老代比較多的應用,可以提高效率.如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件在年輕代的存活 時間,增加在年輕代即被回收的概率.

回收器選擇

JVM給了三種選擇:

1.序列收集器。

2.並行收集器。

3.併發收集器

注:序列收集器只適用於小資料量的情況,所以這裡的選擇主要針對並行收集器和併發收

集器,預設情況下,JDK5.0以前都是使用序列收集器,如果想使用其他收集器需要在啟動時加入相應的引數,在JDK5.0以後,JVM會根據當前系統配置進行判斷。

吞吐量優先的並行收集器,並行收集器主要以到達一定的吞吐量為目標,適用於科學技術和後臺處理等。

典型配置:

-Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 
-XX:UseParallelGC:選擇垃圾收集器為並行收集器,此配置僅對年輕代有效,即上述配置下,年輕代使用併發收集器,而年老代仍使用序列收集。
-XX:ParallelGCThreads=20:配置並行收集器的執行緒數,即:同時有多少個執行緒一起進行垃圾回收,此值最好配置與處理器數目相等。
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC 
-XX:+UseParallelOldGC:配置年老代垃圾收集器為並行收集,JDK6.0支援對年老代並行收集。
-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy 
-XX:MaxGCPauseMillis=100:設定每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調整年輕代大小,以滿足此值. 

-XX:+UseAdaptiveSizePolicy:設定此選項後,並行收集器會自動選擇年輕代區大小和相應的Survivor區比例,以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直開啟. 

相應時間優先的併發收集器,併發收集器主要是保證系統的相應時間,減少垃圾收集時的停頓時間,使用與應用伺服器,電信領域等。

典型配置:

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcmarkSweepGC:設定老年代為併發收集,測試中配置這個以後,-XX:NewRatio=4的配置失效了,原因不明,所以此時年輕代大小最好用-Xmn設定。

-XX:+UseParNewGC:設定年輕代為並行收集.可與CMS收集同時使用.JDK5.0以上,JVM會根據系統配置自行設定,所以無需再設定此值. 

-Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction:由於併發收集器不對記憶體空間進行壓縮,整理,所以執行一段時間以後會產生"碎片”,使得執行效率降低.此值設定執行多少次GC以後對記憶體空間進行壓縮,整理. 
-XX:+UseCMSCompactAtFullCollection:開啟對年老代的壓縮.可能會影響效能,但是可以消除碎片

日誌資訊

JVM提供了大量命令列引數,列印資訊,共除錯使用,主要有以下一些:

-XX:+PrintGC :列印GC的簡要資訊

輸出形式:

[GC 4790K->374K(15872K), 0.0001606 secs]
[GC 4790K->374K(15872K), 0.0001474 secs]

-XX:+PrintGC :列印GC的詳細資訊

輸出形式:

[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 :列印GC發生的時間戳。

輸出形式:

[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

-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 :把相關日誌資訊記錄到檔案以便分析。

常見配置彙總 

堆設定 

-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數.並行收集執行緒數. 

案例:在Eclipse配置JVM的引數

程式碼如下:

public class Test {

	public static void main(String[] args) {

		byte[] b = null;
		
		for (int i=0; i<10; i++){
			
			b = new byte[1*1024*1024];
		}
	}
}
通過Run as->Run Configurations
1.選擇對應的類


2.填寫相應的JVM引數,點選Run