• JVM调优参数


    X或者XX开头的都是非标准化参数

    在这里插入图片描述

    意思就是说标准化参数不会变,非标准化参数可能在每个JDK版本中有所变化

    格式:-XX:[+-] 表示启用或者禁用name属性。
    例子:-XX:+UseG1GC(表示启用G1垃圾收集器)
    
    • 1
    • 2

    -XX:+PrintCommandLineFlags查看当前JVM设置过的相关参数
    在这里插入图片描述

    1.JVM参数分类

    “-”、“-X”、“-XX”

    • 标准参数(-):所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
      -verbose:class,-verbose:gc,-verbose:jni
    • 非标准参数(-X):默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;
      Xms20m,-Xmx20m,-Xmn20m,-Xss128k
    • 非Stable参数(-XX):此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用;
      -XX:+PrintGCDetails,-XX:-UseParallelGC,-XX:+PrintGCTimeStamps

    2.堆参数设置

    -Xms 初始堆大小, 等价于-XX:InitialHeapSize
    -Xmx 最大堆大小, 等价于参数-XX:MaxHeapSize

    JVM的Xms和Xmx要设置成大小一样的,能够避免GC在调整堆大小带来的不必要的压力。

    -XX:NewSize=n 设置年轻代大小-XX:NewRatio=n 设置年轻代和年老代的比值。

    -XX:NewRatio=3,表示年轻代与年老代比值为1:3, 默认为1: 2

    -XX:SurvivorRatio=n 年轻代中Eden区与两个Survivor区的比值。默认是8,表示:Eden:S0:S1=8:1:1

    3.元空间参数

    -XX:MetaspaceSize:Metaspace 空间初始大小,如果不设置的话,默认是20.79M,这个初始大小是触发首次 Metaspace Full GC的阈值。

    -XX:MaxMetaspaceSize:Metaspace 最大值,默认不限制大小,但是线上环境建议设置。

    -XX:MinMetaspaceFreeRatio:最小空闲比,当 Metaspace 发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)小于此值,就会触发 Metaspace 扩容。默认值是 40 ,也就是 40%,
    例如 -XX:MinMetaspaceFreeRatio=40

    -XX:MaxMetaspaceFreeRatio:最大空闲比,当 Metaspace发生 GC 后,会计算 Metaspace 的空闲比,如果空闲比(空闲空间/当前 Metaspace 大小)大于此值,就会触发 Metaspace 释放空间。默认值是 70 ,也就是 70%,
    例如 -XX:MaxMetaspaceFreeRatio=70

    建议将 MetaspaceSize 和 MaxMetaspaceSize设置为同样大小,避免频繁扩容。

    4.栈参数设置

    -Xss:栈空间大小,栈是线程独占的,所以是一个线程使用栈空间的大小。

    例如:-Xss256K,如果不设置此参数,默认值是1M,一般来讲设置成 256K 就足够了。

    5.收集器参数设置

    在这里插入图片描述

    Serial垃圾收集器(新生代)

    开启:-XX:+UseSerialGC 关闭:-XX:-UseSerialGC

    ParNew垃圾收集器(新生代)

    开启 -XX:+UseParNewGC 关闭 -XX:-UseParNewGC

    Parallel Scavenge收集器(新生代)

    开启 -XX:+UseParallelOldGC 关闭 -XX:-UseParallelOldGC

    ParallelOl垃圾收集器(老年代)

    开启 -XX:+UseParallelGC 关闭 -XX:-UseParallelGC

    CMS垃圾收集器(老年代)

    开启 -XX:+UseConcMarkSweepGC 关闭 -XX:-UseConcMarkSweepGC

    G1垃圾收集器

    开启 -XX:+UseG1GC 关闭 -XX:-UseG1GC

    6.GC策略参数配置

    1.GC停顿时间,垃圾收集器会尝试用各种手段达到这个时间,比如减小年轻代
    -XX:MaxGCPauseMillis

    2.堆占用了多少比例的时候触发GC,就即触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%
    -XX:InitiatingHeapOccupancyPercent=n

    3.新生代可容纳的最大对象,大于则直接会分配到老年代,0代表没有限制。
    -XX:PretenureSizeThreshold=1000000

    4.进入老年代最小的GC年龄,年轻代对象转换为老年代对象最小年龄值,默认值7
    -XX:InitialTenuringThreshol=7

    5.升级老年代年龄,最大值15
    -XX:MaxTenuringThreshold

    6.GC并行执行线程数
    -XX:ParallelGCThreads=16

    7.禁用 System.gc(),由于该方法默认会触发 FGC,并且忽略参数中的 UseG1GC 和 UseConcMarkSweepGC,因此必要时可以禁用该方法。
    -XX:-+DisableExplicitGC

    8.设置吞吐量大小,默认99
    -XX:GCTimeRatio

    9.打开自适应策略,各个区域的比率,晋升老年代的年龄等参数会被自动调整。以达到吞吐量,停顿时间的平衡点。
    -XX:UseAdaptiveSizePolicy

    10.设置GC时间占用程序运行时间的百分比
    -XX:GCTimeRatio

    7.Dump异常快照

    -XX:+HeapDumpOnOutOfMemoryError

    -XX:HeapDumpPath

    让JVM遇到OOM异常时能输出堆内信息,并通过(-XX:+HeapDumpPath)参数设置堆内存溢出快照输出的文件地址。

    -Xms10M -Xmx10M -Xmn2M -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError 
    -XX:HeapDumpPath=D:studylog_hprofgc.hprof
    
    • 1
    • 2

    8.GC日志配置

    user-service:

     java  
     -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
     -XX:+UseGCLogFileRotation 
     -XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5  
     -XX:GCLogFileSize=20M    
     -Xloggc:/opt/user-service-gc-%t.log  
     -jar user-service-1.0-SNAPSHOT.jar 
    
    
     -Xloggc:/opt/app/ard-user/user-service-gc-%t.log   设置日志目录和日志名称
     -XX:+UseGCLogFileRotation           开启滚动生成日志
     -XX:NumberOfGCLogFiles=5            滚动GC日志文件数,默认0,不滚动
     -XX:GCLogFileSize=20M               GC文件滚动大小,需开启UseGCLogFileRotation
     -XX:+PrintGCDetails                 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况
     -XX:+ PrintGCDateStamps             记录系统的GC时间           
     -XX:+PrintGCCause                   产生GC的原因(默认开启)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    浅谈 AnalyticDB SQL 优化
    Python入门 —— 从零基础到调包侠
    Java中如何借助InputStream写入文件及保存文件呢?
    设计LRU/LFU缓存结构
    c语言学习——2——占位符、数据类型、查看占多少字节
    Redis(主从复制、哨兵模式、集群)概述及部署
    Framework 为何被称为 Android 开发者必修?
    Dextran-ALK,葡聚糖-炔基|炔基修饰葡聚糖,葡萄糖/乳糖基/黄原胶/岩藻多糖/木聚糖
    Python3.11正式版,它来了!
    XML解析
  • 原文地址:https://blog.csdn.net/m0_67401920/article/details/126582655