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在老年代进行,频率较低但耗时较长。

相关推荐
4311媒体网2 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
猫头虎11 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
wgslucky12 小时前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
痴儿哈哈17 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
野犬寒鸦1 天前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
闻哥1 天前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
星辰_mya1 天前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
蓝帆傲亦1 天前
代码革命!我用Claude Code 3个月完成1年工作量,这些实战经验全给你
jvm·数据库·oracle
Codiggerworld2 天前
JVM内存模型——你的对象住在哪里?
jvm
马猴烧酒.2 天前
【面试八股|JVM虚拟机】JVM虚拟机常考面试题详解
jvm·面试·职场和发展