JVM——JVM 的内存区域是如何划分的?

Java 虚拟机运行时数据区分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。

方法区(Method Area):

1 存储类信息、常量、静态变量和即时编译器(JIT)编译后的代码。

2 属于线程共享区域,所有线程共享方法区内存

3 在 JDK8之前,HotSpot使用永久代(PermGen)来实现方法区,JDK8之后被元空间(Metaspace)取代,元空间使用的是本地内存(Native Memory)。

堆(Heap):

1 用于存放所有线程共享的对象和数组,是垃圾回收的主要区域。

虚拟机栈(JVM Stack):

1 每个线程创建一个栈,用来保存局部变量、操作数栈、动态链接、方法出口信息等

2 局部变量表中存储的是基本数据类型(如int、float)以及对象引用。

3 栈是线程私有的,生命周期与线程相同。

本地方法栈(Native Method Stack):

1 为本地方法服务,使用JNI(Java Native Interface)调用的本地代码在此区域分配内存。

2 和虚拟机栈类似,也是线程私有的。

程序计数器(Program Counter Register):

1 是一个小的内存区域,保存当前线程执行的字节码指令的地址或行号。

2 每个线程都有一个独立的程序计数器,属于线程私有。

堆内存的进一步划分

1 Eden 区:新对象最初会被分配到 Eden 区,且 Eden 区较大,频繁进行垃圾回收。

2 Survivor 区:两个Survivor 区 S0 和 S1 交替使用,新对象在 Eden 区经过一次垃圾回收后存放到其中一个 Survivor区,进一步存活的对象会移动到另一个 Survivor 区,最终晋升到老年代。

3 老年代:长生命周期对象经过多次垃圾回收后会被移到老年代,MaiorGC在老年代进行,频率较低但耗时较长。

相关推荐
小江的记录本12 小时前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小江的记录本17 小时前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
jameslogo21 小时前
类加载机制
jvm
雪度娃娃1 天前
转向现代C++——优先选用删除函数而非private未定义函数
java·jvm·c++
努力发光的程序员1 天前
面试官与程序员谢飞机的3轮Java大厂面试问答实录:涵盖Spring Boot、微服务与数据库技术
java·jvm·spring boot·redis·面试·hibernate·microservices
橙淮1 天前
并发编程(四)
java·jvm
Python+991 天前
C++ 内存模型 & 底层原理
java·jvm·c++
右耳朵猫AI1 天前
Java & JVM技术周刊 2026年第19周
java·开发语言·jvm
1candobetter1 天前
单接口性能测试实践总结:压测方案设计、成功判定与 JVM 监控分析
java·jvm·压力测试·测试
plainGeekDev2 天前
Android运行时面试题:ART和JVM的区别都搞不清,别写精通了
jvm·面试·kotlin