Java基礎學習總結(120)——JVM 引數使用詳細說明

一杯甜酒發表於2017-11-26
一、什麼是JVM?
JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。Java虛擬機器包括一套位元組碼指令集、一組暫存器、一個棧、一個垃圾回收堆和一個儲存方法域。 JVM遮蔽了與具體作業系統平臺相關的資訊,使Java程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。JVM在執行位元組碼時,實際上最終還是把位元組碼解釋成具體平臺上的機器指令執行。
Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機器是實現這一特點的關鍵。一般的高階語言如果要在不同的平臺上執行,至少需要編譯成不同的目的碼。而引入Java語言虛擬機器後,Java語言在不同平臺上執行時不需要重新編譯。Java語言使用Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言編譯程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。這就是Java的能夠“一次編譯,到處執行”的原因。
JVM工作原理和特點主要是指作業系統裝入JVM是通過jdk中Java.exe來完成,通過下面4步來完成JVM環境.
1.建立JVM裝載環境和配置
2.裝載JVM.dll
3.初始化JVM.dll並掛界到JNIENV(JNI呼叫介面)例項
4.呼叫JNIEnv例項裝載並處理class類。
示例為預設值的不需要配置,使用預設設定
二、JVM引數說明
引數名稱
含義
預設值
示例
說明
-Xms
初始堆大小
實體記憶體的1/64(<1GB) ,Server端JVM最好將-Xms和-Xmx設為相同值,開發測試機JVM可以保留預設值
-Xms1000M
預設(MinHeapFreeRatio引數可以調整)空餘堆記憶體小於40%時,JVM就會增大堆直到-Xmx的最大限制.
-Xmx
最大堆大小
實體記憶體的1/4(<1GB),最佳設值應該視實體記憶體大小及計算機內其他記憶體開銷而定
-Xms1000M
預設(MaxHeapFreeRatio引數可以調整)空餘堆記憶體大於70%時,JVM會減少堆直到 -Xms的最小限制
-Xmn
年輕代大小(1.4or lator)
不熟悉最好保留預設值
預設值
注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不同的。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。增大年輕代後,將會減小年老代大小.此值對系統效能影響較大,Sun官方推薦配置為整個堆的3/8
-XX:NewSize
設定年輕代大小(for 1.3/1.4)
不需要設定
-XX:MaxNewSize
年輕代最大值(for 1.3/1.4)
不需要設定
-XX:PermSize
設定持久代(perm gen)初始值
實體記憶體的1/64,不熟悉保留預設值
預設值
-XX:MaxPermSize
設定持久代最大值
實體記憶體的1/4,不熟悉保留預設值
預設值
-Xss
每個執行緒的堆疊大小
JDK5.0 以後每個執行緒堆疊大小為1M,以前每個執行緒堆疊大小為256K.
預設值
根據應用的執行緒所需記憶體大小進行調整。在相同實體記憶體下,減小這個值能生成更多的執行緒.但是作業系統對一個程式內的執行緒數還是有限制的,不能無限生成,經驗值在3000~5000左右,一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。這個選項對效能影響比較大,需要嚴格的測試。(校長)和threadstacksize選項解釋很類似,官方文件似乎沒有解釋,在論壇中有這樣一句話:"”-Xss is translated in a VM flag named ThreadStackSize”一般設定這個值就可以了。
-XX:ThreadStackSize
Thread Stack Size
上面的-Xss不需要設定,如果要設定直接設定這個引數就可以
預設值
(0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]
-XX:NewRatio
年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)
Xms=Xmx並且設定了Xmn的情況下,該引數不需要進行設定。
預設值
-XX:NewRatio=4表示年輕代與年老代所佔比值為1:4,年輕代佔整個堆疊的1/5。
-XX:SurvivorRatio
Eden區與Survivor區的大小比值
 
預設值
設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區佔整個年輕代的1/10
-XX:LargePageSizeInBytes
記憶體頁的大小
=128m,不可設定過大, 會影響Perm的大小
預設值
128m
-XX:+UseFastAccessorMethods
原始型別的快速優化(jdk 1.6 or later)
-
預設值
-XX:+DisableExplicitGC
關閉System.gc()
-
預設值
這個引數需要嚴格的測試
-XX:MaxTenuringThreshold
垃圾最大年齡,表示物件被移到老年代的年齡閾值的最大值
15
預設值
控制物件能經過幾次GC才被轉移到老年代。回收如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代. 對於年老代比較多的應用,可以提高效率.如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活 時間,增加在年輕代即被回收的概率。該引數只有在序列GC時才有效。
-XX:+AggressiveOpts
加快編譯
-
預設值
啟用該選項之後,需要考慮到效能的提升,同樣也需要考慮到效能提升所帶來的不穩定風險。
-XX:+UseBiasedLocking
鎖機制的效能改善 (Java 5 update 6 or later)
+
預設值
Java 5 HotSpot JDK需要明確的命令來啟用這個特性,在使用-XX:+AggressiveOpts選項,有偏見的鎖會Java 5中會被自動啟用。在Java 6中是預設啟用的。
-XX:TLABWasteTargetPercent
TLAB佔eden區的百分比
1%
預設值
-XX:+CollectGen0First
FullGC時是否先YGC
false
預設值
三、收集器相關引數
引數名稱
含義
預設值
示例
說明
-XX:+UseParNewGC
設定年輕代為並行收集
-
+
可與CMS收集同時使用,JDK5.0以上,JVM會根據系統配置自行設定,所以無需再設定此值
-XX:ParallelGCThreads
並行收集器的執行緒數
預設為CPU核心數
預設值
此值最好配置與處理器數目相等 同樣適用於CMS
-XX:+UseConcMarkSweepGC
使用CMS記憶體收集
-
+
注意最新的JVM版本,當開啟此選項時,-XX:UseParNewGC會自動開啟。因此,如果年輕代的並行GC不想開啟,可以通過設定-XX:-UseParNewGC來關掉。
-XX:ParallelCMSThreads
CMS併發收集執行緒數
預設為CPU核心數
預設值
如果還標誌未設定,JVM會根據並行收集器中的-XX:ParallelGCThreads引數的值來計算出預設的並行CMS執行緒數。該公式是ConcGCThreads = (ParallelGCThreads + 3)/4。因此,對於CMS收集器, -XX:ParallelGCThreads標誌不僅影響“stop-the-world”垃圾收集階段,還影響併發階段。總之,有不少方法可以配置CMS收集器的多執行緒執行。正是由於這個原因,建議第一次執行CMS收集器時使用其預設設定, 然後如果需要調優再進行測試
-XX:+UseCMSCompactAtFullCollection
在FULL GC的時候, 對年老代的壓縮
-
+
CMS是不會移動記憶體的, 因此, 這個非常容易產生碎片, 導致記憶體不夠用, 因此, 記憶體的壓縮這個時候就會被啟用。 增加這個引數是個好習慣。可能會影響效能,但是可以消除碎片
-XX:CMSFullGCsBeforeCompaction
full gc多少次後進行記憶體壓縮
預設為0
預設值
由於併發收集器不對記憶體空間進行壓縮,整理,所以執行一段時間以後會產生"碎片",使得執行效率降低.此值設定執行多少次GC以後對記憶體空間進行壓縮,整理.
-XX:CMSInitiatingOccupancyFraction
老年代使用70%後開始CMS收集
=92
=75
為了保證不出現promotion failed(見下面介紹)錯誤,該值的設定需要滿足以下公式
-XX:+CMSClassUnloadingEnabled
持久代使用CMS併發收集
jdk1.7預設關閉,1.8預設開啟
-
它會增加CMS remark的暫停時間,如果沒有程式產生大量的臨時類,新類載入並不頻繁,這個引數還是不開的好
-XX:CMSInitiatingPermOccupancyFraction
設定Perm Gen使用到達多少比率時觸發
=92
預設值
四、日誌相關引數
引數名稱
含義
預設值
示例
說明
-Xloggc
記錄日誌檔案位置
/data/log/jetty/gc.log
-XX:+PrintGCDateStamps
列印可讀的日期而不是時間戳
-
+
-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:+PrintGCApplicationStoppedTime
列印GC停頓時間
-
+
它除了列印清晰的GC停頓時間外,還可以列印其他的停頓時間,比如取消偏向鎖,class 被agent redefine,code deoptimization等等,有助於發現一些原來沒想到的問題,建議也加上。輸出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintCommandLineFlags
列印已配置的XX類引數
-
+
列印出命令列裡設定了的引數以及因為這些引數隱式影響的引數,比如開了CMS後,-XX:+UseParNewGC也被自動開啟
-XX:+HeapDumpOnOutOfMemoryError
輸出Heap Dump到指定檔案
-
+
在Out Of Memory,JVM快死快死掉的時候,輸出Heap Dump到指定檔案。不然開發很多時候還真不知道怎麼重現錯誤。路徑只指向目錄,JVM會保持檔名的唯一性,叫java_pid${pid}.hprof。如果指向檔案,而檔案已存在,反而不能寫入。
-XX:HeapDumpPath
設定Heap Dump輸出路徑
=${LOGDIR}/
五、JAVA檔案相關配置
-Dcom.meizu.properties.key=x1YfmdjyFdu68KJ
-Dcom.meizu.properties.encrypt=true
-Djava.io.tmpdir=/dev/shm
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8
-Dsun.net.http.allowRestrictedHeaders=true

相關文章