🔴 运行时数据区(Run-Time Data Areas) #JVM/运行时数据区
🔴 核心概念:类文件被类装载器装载进来之后,类中的内容需要有个去处进行存储
🟠 装载阶段的关键步骤:
- 🟠 (2) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
- 🟠 (3) 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
简单理解:类文件被类装载器装载进来之后,类中的内容(比如变量,常量,方法,对象等这些数据得要有个去处,也就是要存储起来,存储的位置肯定是在JVM中有对应的空间)
🔴 运行时数据区组成:
- 🔴 程序计数器 (Program Counter Register) - [[线程私有区域#程序计数器]]
- 🔴 Java虚拟机栈 (Java Virtual Machine Stacks) - [[线程私有区域#Java虚拟机栈]]
- 🔴 本地方法栈 (Native Method Stacks) - [[线程私有区域#本地方法栈]]
- 🔴 Java堆 (Java Heap) - [[线程共享区域#Java堆]]
- 🔴 方法区 (Method Area) - [[线程共享区域#方法区]]
注意:前三个是线程私有的,后两个是线程共享的
🔴 内存区域分类
🟠 线程私有区域 (Thread-Private Areas)
特点:
- 🟠 每个线程都有自己独立的副本
- 🟠 线程创建时创建,线程结束时销毁
- 🟠 不会发生线程安全问题
包含组件:
- [[线程私有区域#程序计数器]] - 存储字节码指令地址
- [[线程私有区域#Java虚拟机栈]] - 存储方法调用的栈帧
- [[线程私有区域#本地方法栈]] - 支持本地方法调用
🟠 线程共享区域 (Thread-Shared Areas)
特点:
- 🟠 所有线程共享同一个内存区域
- 🟠 需要考虑线程安全问题
- 🟠 是垃圾回收的主要工作区域
包含组件:
- [[线程共享区域#Java堆]] - 存储对象实例和数组
- [[线程共享区域#方法区]] - 存储类信息、常量池等
🔴 面试重点问题汇总
详细的面试问题请参考:[[面试问题汇总]]
🔴 高频问题:
- "JVM运行时数据区包含哪些组件?"
- "哪些是线程私有的,哪些是线程共享的?"
- "各个内存区域的作用是什么?"
🟠 中频问题:
- "为什么需要区分线程私有和线程共享区域?"
- "各个内存区域可能抛出什么异常?"