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

深入了解一波JVM内存模型

深入了解一波JVM内存模型

JDK体系结构与跨平台特性介绍

image-20250924182234479

通过官方的结构图看出,JVM提供底层的平台支持,JRE提供运行环境所必须的类,在这个基础上去跑我们的java程序。JVM为我们屏蔽了操作系统的差异性,使java程序得以跨平台执行。

image-20250924182742292

JVM内存模型深度剖析

image-20250925093257668

梳理一下过程

  1. 类加载子系统将类加进来
  2. 验证字节码是否是否符合规范
  3. 准备阶段:为静态变量赋初值
  4. 解析阶段:符号引用(类名、方法名等)转换为直接引用(内存地址--》静态链接)
  5. 初始化阶段:给静态变量赋予指定的值,执行静态代码块,初始化父类等
  6. 线程调用具体方法

线程调用方法过程

  1. 线程栈是先入后出的(FILO),后调用的方法执行完才会返回执行前面的方法
  2. 线程栈内部:
    1. 局部表量表存入具体的变量(a、b、c等)
    2. 操作数栈执行具体的计算(10+20,非a+b)
    3. 动态链接指向常量池(元空间),符号引用--》内存地址(方法调用)
    4. 由方法出口跳转到后面的方法栈
  3. 程序执行过程中,由程序计数器记录线程执行到哪了
  4. 执行引擎一边执行,一边记录着当前执行的位置

一些空间结构

  1. 线程栈、本地方法栈、程序计数器都是线程独有的,独占的
  2. 堆、元空间,属于大家共有的空间
  3. 堆中包含所有对象,包括class字节码对象
  4. 元空间包含常量池、静态变量、类元信息(类似C语言结构体,并非字符串之类的)
  5. 元空间占用的是直接物理内存,不做限制可能撑爆整个内存空间

元空间核心 JVM 参数

image-20250925104201575

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):

-XX:MetaspaceSize=256M  # 元空间触发Full GC的初始阈值
-XX:MaxMetaspaceSize=256M  # 元空间的最大容量限制
  1. -XX:MetaspaceSize
    • 作用:设置元空间触发 Full GC 的初始阈值(元空间无固定初始大小)。
    • 默认值:约 21M。当元空间使用量达到此值时,会触发 Full GC 并卸载无用类,同时 JVM 会根据 GC 释放的空间动态调整该阈值(不超过MaxMetaspaceSize)。
  2. -XX:MaxMetaspaceSize
    • 作用:限制元空间的最大容量。
    • 默认值:-1(不限制,仅受本地内存大小约束)。
  3. 最佳实践
    • 建议将两个参数设置为相同值(如 256M),避免 JVM 动态调整元空间大小时频繁触发 Full GC(Full GC 成本高)。
    • 对于 8G 物理内存的机器,256M 是较合理的初始配置,可根据应用实际类加载情况(如大量动态生成类)适当调大。
java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K \-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M \-jar microservice-eureka-server.jar
http://www.hskmm.com/?act=detail&tid=17209

相关文章:

  • 什么是UDFScript用户自定义脚本
  • 【LeetCode】121. 买卖股票的最佳时机
  • CCPC2024-Zhengzhou G Same Sum(线段树)
  • Openwrt-DDNS 配置详解
  • 实用指南:Metal - 2. 3D 模型深度解析
  • 【2025.9.16】关于举办PostgreSQL数据库管理人才研修与评测班的通知
  • Java锁相关问题
  • CDN中使用边缘函数实现自定义编程
  • 第一次课程中的所有动手动脑的问题以及课后实验性的问题
  • 敏捷开发的几个阶段
  • 隐藏在众目睽睽之下:从PEB中解除恶意DLL的链接
  • 设计模式六大原则 - 实践
  • 运营商 API 安全最佳实践、案例与方案推荐(2025)|千万级接口的全链路实战
  • HyperWorks许可与多用户支持
  • react 中 keys 的作用是什么?
  • 破局与进化:火山引擎Data Agent从落地实践到架构未来
  • 五项能力斩获满分!天翼云云WAF获IDC权威认可!
  • 什么样的代码可以称得上是好代码? - 浪矢
  • 微软Teams Channel Agent上线:中国卖家AI赋能品牌出海新机遇与实战策略(2025前瞻) - 详解
  • docker制作
  • lvgl 9.3 style使用导致内存泄漏问题
  • 【AI领域】如何写好Prompt提示词:从新手到进阶的完整指南 - 详解
  • 11_Reactor网络模型
  • 「LNOI2022」盒
  • 【文摘随笔】从业开发工作五年后,再读短篇《孔乙己》——年少不懂孔乙己,长大已成孔乙己
  • 为什么我选择了 PSM 敏捷认证?
  • 外键
  • 菜油
  • 索引
  • 存储过程