Java虛擬機器3:常用JVM命令引數

五月的倉頡發表於2015-09-22

之後寫的東西就會用到虛擬機器引數了,現在這裡匯個總自己平時用到的、看到的一些虛擬機器引數。現在看不懂沒關係,反正之後都會用到的:

(1)-Xms20M

表示設定JVM啟動記憶體的最小值為20M,必須以M為單位

(2)-Xmx20M

表示設定JVM啟動記憶體的最大值為20M,必須以M為單位。將-Xmx和-Xms設定為一樣可以避免JVM記憶體自動擴充套件。大的專案-Xmx和-Xms一般都要設定到10G、20G甚至還要高

(3)-verbose:gc

表示輸出虛擬機器中GC的詳細情況

(4)-Xss128k

表示可以設定虛擬機器棧的大小為128k

(5)-Xoss128k

表示設定本地方法棧的大小為128k。不過HotSpot並不區分虛擬機器棧和本地方法棧,因此對於HotSpot來說這個引數是無效的

(6)-XX:PermSize=10M

表示JVM初始分配的永久代的容量,必須以M為單位

(7)-XX:MaxPermSize=10M

表示JVM允許分配的永久代的最大容量,必須以M為單位,大部分情況下這個引數預設為64M

(8)-Xnoclassgc

表示關閉JVM對類的垃圾回收

(9)-XX:+TraceClassLoading

表示檢視類的載入資訊

(10)-XX:+TraceClassUnLoading

表示檢視類的解除安裝資訊

(11)-XX:NewRatio=4

表示設定年輕代:老年代的大小比值為1:4,這意味著年輕代佔整個堆的1/5

(12)-XX:SurvivorRatio=8

表示設定2個Survivor區:1個Eden區的大小比值為2:8,這意味著Survivor區佔整個年輕代的1/5,這個引數預設為8

(13)-Xmn20M

表示設定年輕代的大小為20M

(14)-XX:+HeapDumpOnOutOfMemoryError

表示可以讓虛擬機器在出現記憶體溢位異常時Dump出當前的堆記憶體轉儲快照

(15)-XX:+UseG1GC

表示讓JVM使用G1垃圾收集器

(16)-XX:+PrintGCDetails

表示在控制檯上列印出GC具體細節

(17)-XX:+PrintGC

表示在控制檯上列印出GC資訊

(18)-XX:PretenureSizeThreshold=3145728

表示物件大於3145728(3M)時直接進入老年代分配,這裡只能以位元組作為單位

(19)-XX:MaxTenuringThreshold=1

表示物件年齡大於1,自動進入老年代

(20)-XX:CompileThreshold=1000

表示一個方法被呼叫1000次之後,會被認為是熱點程式碼,並觸發即時編譯

(21)-XX:+PrintHeapAtGC

表示可以看到每次GC前後堆記憶體佈局

(22)-XX:+PrintTLAB

表示可以看到TLAB的使用情況

(23)-XX:+UseSpining

開啟自旋鎖

(24)-XX:PreBlockSpin

更改自旋鎖的自旋次數,使用這個引數必須先開啟自旋鎖

 

怎麼用MyEclipse設定虛擬機器引數

右鍵類-->Run as-->Run Configurations...

Java Application裡面選到自己的類,選擇Arguments,VM arguments空白部分就可以設定虛擬機器引數了。如果點選了Run Configurations沒有出現自己的類的話也沒關係,雙擊一下Java Application就好了

 

後記

Java虛擬機器引數有上百個,效能調優中很大一塊就是選擇這上百個引數中的某些重要引數進行設定,並且根據專案執行情況對引數進行不斷調整以求達到一個效能最佳點。效能調優說有捷徑也有捷徑,百度搜一份別人推薦的JVM引數設定改改就好了,那至於具體好不好就說不上了,但起碼保證能用吧;效能調優說沒捷徑也沒捷徑,如果對JVM的效能有嚴苛的要求並且希望細化到每一個小點,達到能達到的最佳值,那首先就必須對於Java虛擬機器,對於每一個虛擬機器引數有著深刻的理解才行。最近幾年興起了一個叫做效能調優師的職位,也證明了效能優化的重要性,反正從個人的角度看,效能調優絕對是一門學問,不是那麼簡單的,打好基礎才是王道。

相關文章