更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》
打印参数值
-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 默认开启偏向锁:尝试把锁给访问它的第一个线程,取消 synchronized 原语。
- 在单线程模式下,开启偏向锁会提升性能,因为无需在进行 synchronized 判断。
- 在多线程模式下,JVM 就需要取消偏向锁
设置 AutoBoxing 大小
默认 cache -128~127 之间的 int 和 long。
-XX:AutoBoxCacheMax=10000
Out of Memory 时打印 HeapDump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=...
内存大小
Heap 相关:
-Xms512M -Xmx1024M
堆内存的初始值及最大值
新生代相关:
-Xmn128M
堆中 Young Generation 新生代内存初始值
-XX:NewSize=128M
等同于 -Xmn128M
-XX:MaxNewSize=256M
堆中 Young Generation 新生代内存最大值
新生代内存过大,会降低 GC 的频率,但是会增加每次 GC 时 STW 的时间
永久代相关:
-XX:PermSize=64M
堆中 Perm Generation 永久代内存初始值
-XX:MaxPermSize=128M
堆中 Perm Generation 永久代内存最大值
永久代存储类的定义及常量池,是一块连续的堆空间,默认 64M。
Java 8 取消了永久代,替换为 Metaspace,默认128M:
-XX:MetaspaceSize=128M
Metaspace内存初始值
-XX:MaxMetaspaceSize=256M
Metaspace内存最大值
堆外相关/直接内存,被 netty 等使用:
-XX:MaxDirectMemorySize=128M
堆外内存最大值
GC 优化
XX:+UseConcMarkSweepGC
启用 CMS,并行垃圾回收
XX:+PrintGCDetails
打印 GC 日志
XX:+PrintGCApplicationStoppedTime
打印 GC 的停顿时间
面向 GC 的编程
- 基于数组的集合指定初始化大小,例如 ArrayList, HashMap
- 对象不需要时,将引用设置为 null
- 对象重用,例如线程池
- 使用不可变对象