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

1、JVM内存模型剖析及优化

一、JVM内存结构图解

在这里插入图片描述

JVM内存区域
线程共享
线程私有
方法区/元空间
虚拟机栈<栈>
本地方法栈
程序计数器
关键组件说明:
  1. 堆(Heap)

    • 存储所有对象实例和数组
    • 分代结构:
      年轻代
      Eden
      S0
      S1
      老年代
    • GC过程:
      • Young GC:Eden→Survivor(分代年龄+1)
      • Full GC:回收整个堆(STW明显)
  2. 虚拟机栈

    • 栈帧组成:
      • 局部变量表(基本类型/对象引用)
      • 操作数栈
      • 动态链接
      • 方法出口
    • StackOverflowError示例:
      // -Xss128k时递归约700次崩溃
      void redo() { count++; redo(); }
      
  3. 方法区(元空间)

    • JDK8变化:
      版本实现关键参数
      ≤JDK7PermGen-XX:PermSize
      ≥JDK8Metaspace-XX:MetaspaceSize

二、GC与STW深度解析

STW触发场景:
  1. 必然暂停

    • Young GC(所有实现)
    • Full GC(含CMS重新标记阶段)
    • 元空间扩容(触发Full GC)
  2. 优化手段对比

    GC类型STW时间适用场景
    Serial100ms+客户端小应用
    G110-200ms大堆应用(JDK8+默认)
    ZGC<1ms超大堆(JDK15+)
引用更新机制:
Minor GC开始
扫描GC Roots
复制存活对象到S1/老年代
更新对象引用地址
重置Eden/S0分配指针

三、JVM参数配置手册

1. 基础参数模板
java -Xms2048M -Xmx2048M \      # 堆大小(生产环境建议相同)-Xmn1024M \                # 新生代大小(建议占堆1/3-1/2)-Xss512K \                 # 线程栈大小(默认1M)-XX:MetaspaceSize=256M \   # 元空间初始阈值-XX:MaxMetaspaceSize=256M \# 避免动态扩容Full GC-jar app.jar
2. 进阶调优参数
参数作用说明推荐值
-XX:NewRatio新生代/老年代比例2(默认)
-XX:SurvivorRatioEden/Survivor比例8(默认)
-XX:MaxTenuringThreshold对象晋升老年代年龄阈值15(默认)
-XX:+UseG1GC启用G1收集器JDK8+推荐
3. 内存问题诊断工具
jstat -gcutil <pid> 1000      # 实时GC监控
jmap -heap <pid>              # 堆内存分析
jstack <pid> > thread_dump.log # 线程栈分析

四、常见问题

Q1:对象引用更新过程?

A:Minor GC时通过GC Roots扫描记录引用关系,对象复制后:

  1. 维护跨代引用卡表(Card Table)
  2. 写屏障(Write Barrier)更新引用
  3. 最终批量修正指针
Q2:如何设置MetaspaceSize?

A:建议设置为相同值(如256M),避免运行时因阈值调整触发Full GC。监控建议:

jstat -gcmetacapacity <pid>
Q3:-Xss设置过小的影响?

A:单个线程栈帧容量↓ → 递归深度↓,但可创建线程数↑。需平衡:

  • 计算密集型:增大栈空间(1-2M)
  • 高并发服务:减小栈空间(256-512K)
http://www.lryc.cn/news/618610.html

相关文章:

  • Altium Designer 22使用笔记(6)---板框导入、自绘板框、原点设置
  • 荣耀手机无法连接win11电脑,错误消息:“无法在此设备上加载驱动程序 (hn_usbccgpfilter.sys)。”解决方案
  • 【Linux】Ext系列文件系统
  • 数据结构:后缀表达式:结合性 (Associativity) 与一元运算符 (Unary Operators)
  • 现代化水库运行管理矩阵建设的要点
  • AI Agent——基于 LangGraph 的多智能体任务路由与执行系统实战
  • 【实时Linux实战系列】实时能耗监测与优化技术
  • 《吃透 C++ 类和对象(上):封装、实例化与 this 指针详解》
  • Python训练营打卡Day30-文件的规范拆分和写法
  • 543.二叉树的直径
  • 【前端:Html】--2.进阶:表单
  • 数字孪生重构园区管理效率:技术落地与产业升级的三重跃迁
  • JVM学习笔记-----图解方法执行流程
  • Nginx 启用 HTTPS:阿里云免费 SSL 证书详细图文教程(新手0.5小时可完成)
  • openssl中,公钥和私钥的区别和作用?
  • API 接口接入开发全演示:淘宝商品数据实时抓取
  • 代码随想录刷题Day29
  • 基于51单片机220V交流电流检测系统过流阈值报警设计
  • 通信接口与通信约规
  • 【牛客刷题】REAL806 放它一马:怪物经验值最大化策略详解
  • 【基于DesignStart的M3 SoC】
  • 终端安全检测和防御技术
  • UGUI源码剖析(6):遮罩的“魔法”与“算法”——从C#到Shader,彻底揭示Mask与RectMask2D的原理
  • OpenHarmony编译与烧录
  • HTTPS服务
  • MCU外设初始化:为什么参数配置必须优先于使能
  • Ceph的FileStore存储引擎详解
  • 如何提升需求分析能力
  • NLP—词向量转换评论学习项目分析
  • 【SpringBoot】05 容器功能 - SpringBoot底层注解的应用与实战 - @Configuration + @Bean