更多 Java 虛擬機(jī)方面的文章,請(qǐng)參見文集《Java 虛擬機(jī)》
打印參數(shù)值
-XX:+PrintFlagsFinal
[Global flags]
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency = false {product}
bool AggressiveOpts = false {product}
intx AliasLevel = 3 {C2 product}
bool AlignVector = true {C2 product}
intx AllocateInstancePrefetchLines = 1 {product}
......
......
......
取消偏向鎖
-XX:-UseBiasedLocking
JDK 1.6 默認(rèn)開啟偏向鎖:嘗試把鎖給訪問它的第一個(gè)線程,取消 synchronized 原語。
- 在單線程模式下,開啟偏向鎖會(huì)提升性能,因?yàn)闊o需在進(jìn)行 synchronized 判斷。
- 在多線程模式下,JVM 就需要取消偏向鎖
設(shè)置 AutoBoxing 大小
默認(rèn) cache -128~127 之間的 int 和 long。
-XX:AutoBoxCacheMax=10000
Out of Memory 時(shí)打印 HeapDump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=...
內(nèi)存大小
Heap 相關(guān):
-Xms512M -Xmx1024M
堆內(nèi)存的初始值及最大值
新生代相關(guān):
-Xmn128M
堆中 Young Generation 新生代內(nèi)存初始值
-XX:NewSize=128M
等同于 -Xmn128M
-XX:MaxNewSize=256M
堆中 Young Generation 新生代內(nèi)存最大值
新生代內(nèi)存過大,會(huì)降低 GC 的頻率,但是會(huì)增加每次 GC 時(shí) STW 的時(shí)間
永久代相關(guān):
-XX:PermSize=64M
堆中 Perm Generation 永久代內(nèi)存初始值
-XX:MaxPermSize=128M
堆中 Perm Generation 永久代內(nèi)存最大值
永久代存儲(chǔ)類的定義及常量池,是一塊連續(xù)的堆空間,默認(rèn) 64M。
Java 8 取消了永久代,替換為 Metaspace,默認(rèn)128M:
-XX:MetaspaceSize=128M
Metaspace內(nèi)存初始值
-XX:MaxMetaspaceSize=256M
Metaspace內(nèi)存最大值
堆外相關(guān)/直接內(nèi)存,被 netty 等使用:
-XX:MaxDirectMemorySize=128M
堆外內(nèi)存最大值
GC 優(yōu)化
XX:+UseConcMarkSweepGC
啟用 CMS,并行垃圾回收
XX:+PrintGCDetails
打印 GC 日志
XX:+PrintGCApplicationStoppedTime
打印 GC 的停頓時(shí)間
面向 GC 的編程
- 基于數(shù)組的集合指定初始化大小,例如 ArrayList, HashMap
- 對(duì)象不需要時(shí),將引用設(shè)置為 null
- 對(duì)象重用,例如線程池
- 使用不可變對(duì)象