jvm 参数

内存

参数 作用 解释和建议
-Xms 设置堆内存最小值 与 Xmx 相等
-Xmx 设置堆内存最大值 与 Xms 相等
-Xmn 设置新生代大小(绝对值) 设置为整个堆空间的1/4或1/3
过小会增加 Minor GC频率,过大会减小老年代的大小
新生代+老年代=堆,这里设置新生代空间,剩下的就是老年代的空间
-XX:NewRatio 设置新生代与老年代比值 -Xmn 是设置数值,这个是设置比例,都是设置新老代的大小,和 -Xmn 二选一
-XX:NewRatio=3 表示新生代与老年代所占比例为1:3,新生代占整个堆的 1/4
-Xss 设置虚拟机栈大小 jdk5+版本每个栈大小默认为 1M,jdk5 以前的版本每个线程池大小默认是 256k
栈内存越小,能创建的线程数量越多,栈内存越大,创建的线程数越少
-XX:PermSize 设置非堆区(方法区)最小值 默认是本地内存的 1/64
-XX:MaxPermSize 设置非堆区(方法区)最大值 默认是本地内存的 1/4
-XX:MaxTenuringThreshold 设置新生代对象晋级到老年代的年龄 默认15
-XX:SurvivorRatio 设置 Eden 区与 Subrvivor 区大小的比值 如果设置为8,两个 Subrvivor 区与 Eden 区的比值为 1:1:8
-XX:+UseFastAccessorMethods 原始类型快速优化
-XX:+AggressiveOpts 编译速度加快
-XX:PretenureSizeThreshold 设置大对象大小 对象超过多大值时直接分配到老年代

为什么 -Xms 和 -Xmx 建议一致?

避免每次 GC 后动态调整堆空间大小,比如 -Xms=100,-Xmx=200,当发生 GC 时堆内存是 190M,回收了 30M,GC 结束后会把堆空间大小调整为 160M

垃圾收集器

7种垃圾收集器能互相搭配,有的搭配方式在不同的版本中弃用、废弃、删除,这里只说在 jdk8 环境下推荐的搭配方式

搭配方式(Yong+Old) 参数 使用场景 特点
第一组 Serial + Serial Old -XX:+UseSerialGC 硬件配置不高的服务器,比如单核 CPU 新老年代都是单线程串行回收
第二组 Parallel + Parallel Old -XX:+UseParallelGC 动态自适应调整堆内存分配比例和吞吐量优先 jdk8默认,新老年代多线程串行回收
第三组 ParNew + CMS -XX:+UseConcMarkSweepGC 高吞吐量 新生代多线程串行,老年代多线程并发
当指定了 -XX:+UseConcMarkSweepGC 默认的年轻代收集器是 ParNew,也会在需要压缩内存的时候使用 Serial Old
第四组 G1 -XX:+UseG1GC 高吞吐量 jdk9 默认
  1. SerialGC 示例

    java -XX:+UseSerialGC -Xms512m -Xmx512m -jar your-application.jar
    
  2. ParallelGC 示例

    java -XX:+UseParallelGC \ # 启用 ParallelGC
         -Xms4g \ # 堆最小内存
         -Xmx8g \ # 堆最大内存
         -XX:NewSize=2g \  # 年轻代初始大小
         -XX:MaxNewSize=4g \ # 年轻代最大大小
         -XX:ParallelGCThreads=8 \ # 年轻代垃圾回收线程数量
         -XX:ConcGCThreads=4 \ # 老年代垃圾回收线程数量
         -Xlog:gc*:file=/path/to/gc.log \ # 启用 GC 日志记录到指定文件
         -XX:+PrintGCDetails \ # 每次回收,打印/记录回收信息,包括 各代内存的使用情况、垃圾回收前后堆内存大小、回收的垃圾量、回收所花的时间
         -XX:+PrintGCDateStamps \ # 每次回收,打印/记录执行的时间点(什么时候执行的)
         -jar your-application.jar
    
  3. CMS 示例

    java -XX:+UseConcMarkSweepGC \ # 启用 CMS(新生代默认用 ParNew,当需要时自动使用 Serial Old 压缩内存)
         -Xms2g -Xmx4g \ # 堆最小和最大内存
         -XX:NewRatio=2 \ # 年轻代与老年代的比率设置为 1:2
         -XX:CMSInitiatingOccupancyFraction=70 \ # 触发 CMS GC 的老年代使用率(当老年代使用率达到 70% 的时候触发,默认值是 80%)
         -XX:+CMSParallelRemarkEnabled -XX:ParallelCMSThreads=4 \ # 启用 CMS 并发标记, 4 个线程
         -XX:ConcGCThreads=4 \ # 并发 GC 线程数为 4
         -XX:MaxGCPauseMillis=200 \ # 期望的最大垃圾回收停顿时间为 200 毫秒
         -XX:CMSFullGCsBeforeCompaction=5 \ # CMS 回收 5 次后压缩一次
         -XX:+CMSNoAbortPreclean \ # 禁用 CMS 并发预清理,以减少垃圾回收中断
         -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ # GC 日志
         -jar YourApplication.jar
    
  4. G1 示例

    java -XX:+UseG1GC \ # 启用 G1
         -Xms4g -Xmx4g \ # 堆最小和最大内存
         -XX:NewSize=2g -XX:MaxNewSize=2g \ # 新生代初始和最大大小
         -XX:MaxGCPauseMillis=200 \ # 期望的最大垃圾回收停顿时间,默认为 200 毫秒
         -XX:ParallelGCThreads=4 \ # 并行垃圾回收的线程数为 4
         -XX:ConcGCThreads=4 \ # 并发标记的线程数为 4
         -XX:TargetSurvivorRatio=50 \ # 年轻代中幸存对象的目标比例
         -XX:G1HeapRegionSize=16m \ # 每个 Region 大小
         -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \ # GC 日志
         -jar YourApplication.jar
    
posted @ 2023-04-14 16:12  CyrusHuang  阅读(82)  评论(0编辑  收藏  举报