JVM 调优参数配置

掌握并理解 JVM 常用参数,并能根据实际情况,对 JVM 进行适当的配置提高应用性能是每个 Java 后端必备的。本文介绍 JVM 常用参数和调优经验。

JVM 常用参数

  • -Xms,初始堆大小

    物理内存的 1 / 64,默认(MinHeapFreeRatio 参数可以调整)空余堆内存小于 40% 时,JVM 就会增大堆直到 -Xmx 的最大限制。

  • -Xmx,最大堆大小

    默认:物理内存的 1 / 4,默认(MaxHeapFreeRatio 参数可以调整)空余堆内存大于 70% 时,JVM 会减少堆直到 -Xms 的最小限制。

  • -Xmn,年轻代大小,1.4 以后配置。

    包括:一个 Eden 区和两个 Survivor 区,整个堆大小 = 年轻代大小 + 年老代大小 + 持久代大小。增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3 / 8。

  • -XX:NewRatio,年轻代与年老代的比值

    具体指:年轻代(Eden + 2*Survivor) / 年老代(去除持久代)。-XX:NewRatio=4 表示年轻代与年老代所占比值为 1:4,年轻代占整个堆栈的 1 / 5,Xms=Xmx 并且设置了 Xmn 的情况下,该参数可以不用设置。

  • -XX:survivorRatio,Eden 区与 Survivor 区的大小比值

    比如:设置为 8,则表示两个 Survivor 区与一个 Eden 区的比值为 2 : 8,一个 Survivor 区占整个年轻代的 1 / 10。

  • -Xss,每个线程的堆栈大小

    JDK5 以后每个线程堆栈大小为 1M,以前每个线程堆栈大小为 256K。可根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。

    一般小的应用, 如果栈不是很深, 应该是 128k 够用,大的应用建议使用 256k,这个选项对性能影响比较大,需要严格的测试。

  • -XX:MetaspaceSize,持久代大小

  • -XX:MaxMetaspaceSize,持久代最大值

GC 收集器相关的参数

  • -XX:+UseSerialGC,串行收集器。
  • -XX:+UseParNewGC,设置年轻代为并行收集。
  • -XX:+UseParallelGC,选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即该配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
  • -XX:+UseParallelOldGC,配置老年代垃圾收集器为并行收集。
  • -XX:+UseConcMarkSweepGC,使用 ParNew + CMS + Serial Old 收集器组合进行垃圾收集。Serial Old 作为 CMS 收集器出现 Concurrent Mode Failure 的备用垃圾收集器。

JVM 优化方面的考虑

前提:针对后台服务应用。

堆大小

如果不特殊设置的话,JVM 会根据操作系统情况灵活分配堆内存,并调整和释放。

一般的我们会配置 Xms 和 Xmx 一样大,并根据情况尽可能多的给大。

新生代大小

MaxPermSize 和 MinPermSize 设置一样大,减轻伸缩堆大小带来的压力。堆大小确定的话,增加新生代的大小意味着减少了老年代的大小。根据实际情况调整老年代大小,并预留一点空间,尽可能不要 Full GC,这样就推出了新生代大小。

参考资料

https://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html