【JVM】(3)JVM内存模型深度剖析与优化




实际上栈帧你可以把认为它把不同方法内存局部变量的一些内存给它隔离开来


一、运行时数据区(内存模型)

这是JVM在运行时划分的内存区域,包含4个核心部分:

  1. 堆

    • 是Java对象存储的主要区域,通过-Xms(初始堆大小)、-Xmx(最大堆大小)配置。
    • 堆内部又分为新生代 ,通过-Xmn配置其大小。
  2. 方法区

    • 存储类信息、常量、静态变量等,JDK8及以后用"元空间"实现,通过-XX:MetaspaceSize(元空间初始阈值)、-XX:MaxMetaspaceSize(元空间最大值)配置。
  3. 栈(线程私有)

    • 每个线程对应一个栈,存储方法调用的局部变量、方法出口等,通过-Xss配置单个线程栈的大小。

二、JVM参数配置(以Spring Boot+Tomcat为例)

图片给出了Spring Boot程序的JVM参数示例:

复制代码
java -Xms248M -Xmx248M -Xmn1024M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -jar microservice-eureka-server.jar

其中元空间参数是重点说明的内容:

  • -XX:MaxMetaspaceSize:设置元空间的最大值,默认-1(不限制,仅受物理内存约束)。
  • -XX:MetaspaceSize:元空间触发Full GC的初始阈值(默认21M)。当元空间占用达到这个值时,会触发Full GC并调整该阈值(释放空间多则降低,释放少则在不超过MaxMetaspaceSize的前提下提高)。

三、元空间参数的优化建议

由于元空间大小调整需要触发Full GC(开销很大) ,所以建议:

将MetaspaceSize和MaxMetaspaceSize设置为相同的值 ,且比初始值大(比如8G物理内存的机器,建议都设为256M)。

这样可以避免元空间动态调整导致的频繁Full GC,提升程序启动/运行的稳定性。

https://www.bilibili.com/video/BV1nR4y1W7Vp/?spm_id_from=333.337.search-card.all.click\&vd_source=ab1f504cc6070d898cd8502e76fd9929


这两张图是围绕高并发订单系统的JVM内存调优展开的,核心是通过合理配置内存区域,减少Full GC(避免影响系统性能),下面分图解释:

第一张图:高并发订单系统的内存压力分析

这张图展示了日均50万订单系统的流量特征+内存消耗逻辑,最终给出了对应的JVM参数配置:

  1. 流量&订单特征

    • 亿级点击→日均5000万用户→10%支付转化率→日均50万订单;
    • 大促时每秒1000单(是日常的几十倍),订单系统拆分为多实例(3核4G/4核8G)承载。
  2. 内存消耗计算

    • 单个订单对象≈1KB → 大促每秒1000单≈1MB/秒;
    • 但订单涉及库存、优惠券等对象,内存放大20倍→20MB/秒;
    • 再加异步操作(如订单状态同步),内存再放大10倍→200MB/秒。
  3. 对应的JVM参数

    bash 复制代码
    java -Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar xxx.jar

    (堆设为3G,元空间固定512M,避免动态调整)

第二张图:JVM调优目标------减少Full GC

这张图是阿里面试题的调优思路,核心是"让对象尽量在新生代回收,少进老年代":

  1. 内存区域配置

    • 堆总大小3G(-Xms/-Xmx=3072M),其中新生代2048M (-Xmn=2048M,包含Eden区800M、S0/S1各100M),老年代2G;
    • 线程栈1M(-Xss=1M),元空间256M(固定大小)。
  2. 调优逻辑

    • 线程每秒产生60MB对象,新生代Eden区800M→约14秒填满Eden,触发Minor GC(新生代GC,停顿短);
    • 让大部分对象在Minor GC时被回收,少进入老年代→老年代不会频繁填满,从而避免Full GC(老年代GC,停顿长)。
  3. 核心结论

    JVM调优的关键是:让对象尽量在新生代分配/回收,减少老年代占用,同时给足内存,避免新生代频繁GC。


相关推荐
晒太羊的猫7 小时前
jvm面试题
jvm
夜之眷属11 小时前
Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场
java·运维·服务器·jvm
用户0942485680312 小时前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
阿俊-全栈开发14 小时前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城
Nebula_g16 小时前
JavaSE加强:线程Thread(线程安全重点)
java·开发语言·jvm·算法·javase·技术栈
JAVA面经实录91716 小时前
Java高级后端 · 全套面试通关手册(线上故障排查)
java·jvm·面试
sibylyue19 小时前
SQLite 运行模式
java·jvm·sqlite
toooooop819 小时前
宝塔Python项目管理器:环境变量踩坑记录
java·jvm·python
佳児素花痴╮1 天前
线程知识点
java·开发语言·jvm
用户094248568032 天前
第29章:【OpenJDK中级篇综合实战】百万长连接网关的JVM稳定性工程
java·jvm