当前位置: 首页 > news >正文

Eden 和 Survivor 比例可以调整么,参数是什么?还用到了哪些参数?

Git高速下载
程序员面试资料大全|各种技术书籍等资料-1000G


一、Eden 与 Survivor 比例调整

1. 核心参数
  • -XX:SurvivorRatio=N
    定义Eden 区大小单个 Survivor 区大小的比例(默认值 8
    计算公式
    Eden = (Ratio / (Ratio + 2)) * YoungGen  
    Survivor = (1 / (Ratio + 2)) * YoungGen  (每个 Survivor 区)
    
    示例
    -XX:SurvivorRatio=8   # Eden : Survivor0 : Survivor1 = 8:1:1
    -XX:SurvivorRatio=4   # Eden : Survivor0 : Survivor1 = 4:1:1(Eden 占比减小)
    
2. 验证设置生效
jinfo -flag SurvivorRatio <pid>     # 查看当前比例
jstat -gc <pid>                     # 观察 EU(eden) / SU(survivor) 实际大小

二、年轻代关键参数大全

参数作用默认值
-XX:NewRatio=N老年代与年轻代的大小比(OldGen:YoungGen = N:1JDK8: 2
-Xmn<size>直接设置年轻代总大小(优先级高于 NewRatio
-XX:InitialSurvivorRatio=N初始 Survivor 比例(通常被 SurvivorRatio 覆盖)8
-XX:+UseAdaptiveSizePolicy开启自适应大小策略(动态调整 Eden/Survivor)ParallelGC 开启
-XX:TargetSurvivorRatio=NSurvivor 区目标使用率(影响对象晋升年龄)50(百分比)
-XX:MaxTenuringThreshold=N对象晋升老年代的年龄阈值15
-XX:+NeverTenure对象永不晋升老年代(Survivor 不足直接 OOM)关闭
-XX:+AlwaysTenure对象在第一次 Minor GC 后直接进入老年代关闭

三、配置示例与原理

场景:优化短生命周期对象应用(如 Web 服务)
-Xmn1.5g                           # 年轻代固定 1.5GB
-XX:SurvivorRatio=6                # Eden 占 6/8=75%,每个 Survivor 占 12.5%
-XX:TargetSurvivorRatio=90         # 允许 Survivor 使用到 90%(避免浪费空间)
-XX:MaxTenuringThreshold=6         # 降低晋升阈值,加速回收

内存分配效果

年轻代总量 = 1536 MB- Eden = (6/(6+2)) * 1536 = 1152 MB- Survivor0 = 192 MB- Survivor1 = 192 MB

四、调优注意事项

  1. Survivor 空间不足的后果

    • 对象直接晋升老年代 → 老年代碎片化 + 提前触发 Full GC
    • 解决方案:增大 -XX:SurvivorRatio整体扩大年轻代 (-Xmn)
  2. 自适应策略的干扰

    • 若开启 -XX:+UseAdaptiveSizePolicy(ParallelGC 默认开启),JVM 会动态覆盖 SurvivorRatio
    • 需关闭自适应以固定比例:
      -XX:-UseAdaptiveSizePolicy   # 关闭自适应
      
  3. G1 收集器的差异

    • G1 没有 SurvivorRatio 概念!
    • 通过分区(Region)自动管理,需调整目标暂停时间:
      -XX:+UseG1GC -XX:MaxGCPauseMillis=200  # 控制 GC 最大停顿时间
      

五、监控与验证手段

  1. GC 日志分析

    -Xlog:gc*,gc+age=trace:file=gc.log  # JDK9+ 打印对象年龄分布
    
    • 关注日志中的 Desired survivor sizenew threshold(动态晋升阈值)
  2. jstat 实时观测

    jstat -gcutil -t <pid> 1000  # 每秒输出各区域使用率
    

    输出关键列

    • YGC:Young GC 次数
    • YGCT:Young GC 总耗时
    • S0/S1:Survivor 区使用率
    • TT(Tenuring Threshold):当前晋升阈值
    • MTT(Max Tenuring Threshold):最大晋升阈值
  3. 堆转储分析

    jmap -dump:live,format=b,file=heap.hprof <pid>
    

    Eclipse MAT 分析对象年龄分布:

    // 查看对象在年轻代的滞留时间
    Objects -> Group By -> Object Age (Generations)
    

六、经验性调优建议

场景策略
短生命周期对象居多增大 Eden 比例(-XX:SurvivorRatio=10~12),降低晋升阈值(-XX:MaxTenuringThreshold=3~5
存在中等生命周期对象扩大 Survivor 区(-XX:SurvivorRatio=4~6),提高 TargetSurvivorRatio=70~90
频繁发生过早晋升检查 Survivor 是否过小 → 增大 -Xmn 或 调整 SurvivorRatio
CMS/G1 老年代碎片严重降低晋升速度 → 增大 -XX:MaxTenuringThreshold 或 扩大 Survivor

程序员面试资料大全|各种技术书籍等资料-1000G
Git高速下载

在这里插入图片描述

http://www.lryc.cn/news/607512.html

相关文章:

  • SpringCloud(一)微服务基础认识
  • U-Net vs. 传统CNN:为什么医学图像分割需要跳过连接?
  • 04 基于sklearn的机械学习-梯度下降(上)
  • Linux内核构建系统中的auto.conf与autoconf.h:原理与作用解析
  • ARM Cortex-M 处理器的应用
  • NDI开发指南
  • LeetCode 热题100:206. 反转链表
  • 深入讲讲异步FIFO
  • 向华为学习——IPD流程体系之IPD术语
  • Java函数式编程之【Stream终止操作】【下】【三】【收集操作collect()与分组分区】【下游收集器】
  • 从零开始:Python编程快速入门指南
  • 实战指南:如何将Git仓库中的特定文件夹及其历史完整迁移到另一个仓库
  • vue+element 实现下拉框共享options
  • 智能客服系统实战:多轮对话与知识库检索完整实现
  • 《n8n基础教学》第三节:模拟一个自动化场景
  • Android使用MediaProjectionManager获取游戏画面和投屏
  • C语言-字符串(定义)、字符串函数(strlen、strcat、strcpy、strcmp、strlwr、strupr)
  • 【string类常见接口】
  • Linux系统编程Day3-- Linux常用操作(续)
  • 基于深度学习的医学图像分析:使用Autoencoder实现医学图像去噪
  • Flask 路由系统:URL 到 Python 函数的映射
  • Coze Studio概览(五)--工作流管理
  • 20250801在Ubuntu24.04.2LTS下编译firefly_itx_3588j的Android12时解决boot.img过大的问题
  • 【lucene】FastVectorHighlighter案例
  • 基于线性规划的储能充放电仿真系统
  • Android Frameworks从零开始
  • JSON 对象在浏览器中顺序与后端接口返回不一致的问题
  • 好未来披露2026财年Q1财报:净利润3128万美元,同比大增174%
  • Day 28:类的定义和方法
  • Git 命令使用指南:从入门到进阶