JVM 运行时数据区域

最近在准备面试,正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解,以及高频业务场景的应对策略系统梳理一遍,既能加深记忆,也能让知识体系更扎实,供大家参考,欢迎讨论。

Java 虚拟机(JVM)在运行时会将内存划分为若干区域,每个区域承担不同的职责和特性。主要包括:堆、元空间(方法区)、虚拟机栈、本地方法栈和程序计数器。本文基于 JDK 8 进行说明。

1. 堆(Heap)

  • 作用 :存放对象实例和数组,是线程共享的内存区域,也是垃圾回收(GC)的主要区域

    • 新生代:Eden + Survivor1 + Survivor2
    • 老年代:存放长期存活的对象

2. 方法区(Method Area / MetaSpace)

  • 作用:存放已加载的类信息、常量、静态变量等。

  • JDK 变化

    • JDK 1.8 及之后取消永久代(PermGen),改为 元空间(MetaSpace)
  • 注意

    • 类数量过多(比如 Spring 大量使用 CGLIB 或 JDK Proxy 动态生成代理类))可能导致 元空间溢出

3. 虚拟机栈(JVM Stack)

  • 特点

    • 线程私有,生命周期与线程一致。

    • 栈帧(Stack Frame)存储方法执行的上下文:

      • 局部变量表:存放方法参数和局部变量,底层为变量槽。
      • 操作数栈:方法执行过程中入栈和出栈操作的临时区域。
      • 动态链接:运行时将符号引用转为直接引用。
      • 返回地址:记录方法调用返回位置。
  • 异常

    • 栈深度超限 → StackOverflowError
    • 栈内存不足 → OutOfMemoryError

4. 本地方法栈(Native Method Stack)

  • 作用:服务于本地方法(Native 方法),类似虚拟机栈。
  • 异常 :同样可能抛出 StackOverflowErrorOutOfMemoryError

5. 程序计数器(PC Register)

  • 作用:存放当前线程下一条指令的地址。

  • 特点

    • 线程私有,切换线程时能恢复执行位置。
    • 内存空间很小。
相关推荐
我科绝伦(Huanhuan Zhou)几秒前
银河麒麟V10编译perl-5.42.0,并设置环境变量
开发语言·perl
舒克起飞了4 分钟前
设计模式——单例模式
java·单例模式·设计模式
大飞pkz5 分钟前
【设计模式】享元模式
开发语言·设计模式·c#·享元模式
Java&Develop15 分钟前
GitLab-如何基于现有项目仓库,复制出新的项目仓库
java
茉莉玫瑰花茶20 分钟前
C++扩展 --- 并发支持库(补充3)
开发语言·c++
一只乔哇噻27 分钟前
java后端工程师进修ing(研一版‖day49)
java·开发语言
稻草猫.30 分钟前
Java线程安全:volatile与wait/notify详解
java·后端·idea
枫叶丹430 分钟前
【Qt开发】输入类控件(二)-> QTextEdit
开发语言·qt
无敌最俊朗@1 小时前
MQTT 关键特性详解
java·前端·物联网
JAVA学习通1 小时前
微服务项目->在线oj系统(Java-Spring)----[前端]
java·开发语言·前端