JVM 优化

JVM JIT优化

  • 禁用System.gc
    • System.gc会触发full GC,非常耗系统性能
    • 参数设置 -XX:-DisableExplicitGC
  • 逃逸分析与标量替换(主要是编译器在做)
  • 关闭偏向锁优化
    • 一把锁被使用之后不主动释放,保留给当前的使用者,预判等下一个进程来获取的时候再释放出来
    • 关闭偏向锁
      • -XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
  • 指针压缩
    • -XX:+UseCompressedOops
  • 开启服务端模式
    • 开启服务端模式可支持即时编译器和解释器两种执行引擎,执行效率最高的是即时编译器,运行时把Class文件字节码编译成本地机器码
    • 参数设置 => -server
  • 增加使用即时编译器的可能性
    • 写方法时尽量不要写得太大,让JVM尽可能使用即时编译器编译代码,超过3层if、for就要分方法了
    • 参数设置 -XX:CompileThreshold=8000, 使得一个方法被调用超过8000次以后使用即时编译器编译为机器码
    • 注意默认值是 10000

注:

解释器是在程序启动时就开始执行了,它解释执行Class字节码,这样能省去编译时间,加快启动速度; 唯一的缺点就是执行效率较低;

JIT编译器是在程序解释运行后,JIT编译器逐渐发挥作用;它主要把高频率代码编译成本地代码,提高执行效率;
唯一的缺点就是占用程序运行时间、内存等资源;说白的就是以空间换时间!

JIT编译对象与触发条件

  • 热点代码
    • 被多次调用的方法
    • 被多次执行的循环体
  • 热点探测(Hot Spot Deection)方法
    • 基于采样的热点探测(Sample Base Hot Spot Detection)
    • 基于计数器的热点探测(Counter Base Hot Spot Detection)

JVM 内存优化

  • 将新对象预留在年轻代
    • -XX:TargetSurvivorRatio=90
  • 让大对象进入年老代
    • -XX:PetenureSizeThreshold=1000000,1M
  • 设置对象进入年老代的年龄
    • -XX:MaxTenuringThreshold=30
    • 表示在新生代经过31次回收以后还存活的对象移到老年代,默认值是15,设置30的目的是让对象尽可能的在新生代就被回收,避免进入老年代触发full GC
  • 稳定的 Java 堆
    • Xmx与Xms相同

JVM 参数详细说明

  • -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
  • -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
  • -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
  • -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
  • -XX:NewRatio:新生代和老年代的比
  • -XX:ParallelCMSThreads:设定CMS的线程数量
  • -XX:ParallelGCThreads:设置用于垃圾回收的线程数
  • -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
  • -XX:+UseParNewGC:在新生代使用并行收集器
  • -XX:+UseParallelGC :新生代使用并行回收收集器
  • -XX:+UseParallelOldGC:老年代使用并行回收收集器
  • -XX:+UseSerialGC:在新生代和老年代使用串行收集器
  • -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
  • -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
  • -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
  • -Xms:设置堆的最小空间大小。
  • -Xmx:设置堆的最大空间大小。
  • -XX:NewSize设置新生代最小空间大小。
  • -XX:MaxNewSize设置新生代最大空间大小。
  • -XX:PermSize设置永久代最小空间大小。
  • -XX:MaxPermSize设置永久代最大空间大小。
  • -Xss:设置每个线程的堆栈大小

JVM 优化配置示例

服务器:16 cpu, 16G mem

java -Xmx7000m -Xms7000m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=6 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=30