Java JVM 参数优化

更多 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
  • 对象重用,例如线程池
  • 使用不可变对象

你可能感兴趣的:(Java JVM 参数优化)