深入了解一波JVM内存模型
JDK体系结构与跨平台特性介绍
通过官方的结构图看出,JVM提供底层的平台支持,JRE提供运行环境所必须的类,在这个基础上去跑我们的java程序。JVM为我们屏蔽了操作系统的差异性,使java程序得以跨平台执行。
JVM内存模型深度剖析
梳理一下过程
- 类加载子系统将类加进来
- 验证字节码是否是否符合规范
- 准备阶段:为静态变量赋初值
- 解析阶段:符号引用(类名、方法名等)转换为直接引用(内存地址--》静态链接)
- 初始化阶段:给静态变量赋予指定的值,执行静态代码块,初始化父类等
- 线程调用具体方法
线程调用方法过程
- 线程栈是先入后出的(FILO),后调用的方法执行完才会返回执行前面的方法
- 线程栈内部:
- 局部表量表存入具体的变量(a、b、c等)
- 操作数栈执行具体的计算(10+20,非a+b)
- 动态链接指向常量池(元空间),符号引用--》内存地址(方法调用)
- 由方法出口跳转到后面的方法栈
- 程序执行过程中,由程序计数器记录线程执行到哪了
- 执行引擎一边执行,一边记录着当前执行的位置
一些空间结构
- 线程栈、本地方法栈、程序计数器都是线程独有的,独占的
- 堆、元空间,属于大家共有的空间
- 堆中包含所有对象,包括class字节码对象
- 元空间包含常量池、静态变量、类元信息(类似C语言结构体,并非字符串之类的)
- 元空间占用的是直接物理内存,不做限制可能撑爆整个内存空间
元空间核心 JVM 参数
Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):
-XX:MetaspaceSize=256M # 元空间触发Full GC的初始阈值
-XX:MaxMetaspaceSize=256M # 元空间的最大容量限制
-XX:MetaspaceSize
- 作用:设置元空间触发 Full GC 的初始阈值(元空间无固定初始大小)。
- 默认值:约 21M。当元空间使用量达到此值时,会触发 Full GC 并卸载无用类,同时 JVM 会根据 GC 释放的空间动态调整该阈值(不超过
MaxMetaspaceSize
)。
-XX:MaxMetaspaceSize
- 作用:限制元空间的最大容量。
- 默认值:-1(不限制,仅受本地内存大小约束)。
- 最佳实践
- 建议将两个参数设置为相同值(如 256M),避免 JVM 动态调整元空间大小时频繁触发 Full GC(Full GC 成本高)。
- 对于 8G 物理内存的机器,256M 是较合理的初始配置,可根据应用实际类加载情况(如大量动态生成类)适当调大。
java -Xms2048M -Xmx2048M -Xmn1024M -Xss512K \-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M \-jar microservice-eureka-server.jar