当前位置: 首页 > news >正文

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)

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

  • 特点

    • 线程私有,切换线程时能恢复执行位置。
    • 内存空间很小。
http://www.xdnf.cn/news/1459657.html

相关文章:

  • java面试中经常会问到的dubbo问题有哪些(基础版)
  • JVM 类加载全过程
  • Node-RED服务成本/价格很高?那这不到“三张”的怎么说?
  • QT卡顿的可能原因
  • TP8 数组在模板html文件中输出json字符串格式{“0“:“x1“,“1“:“x2“,“2“:“x3“}
  • 在Spring MVC中使用查询字符串与参数
  • 2025市面上比较实用的财会行业证书,最值得考的8个职业证书推荐
  • 本地部署开源数据生成器项目实战指南
  • HarmonyOS应用开发之界面列表不刷新问题Bug排查记:从现象到解决完整记录
  • JS函数进阶
  • Roo Code之自定义指令(Custom Instructions),规则(Rules)
  • 硬盘分区格式化后产生了哪些变化
  • OpenStack VLAN网络类型实训案例
  • 机器学习:后篇
  • LangChain4j的初步学习【逐步添加中】
  • 强化学习DQN解决Cart_Pole问题
  • claude code route 使用教程|命令大全
  • linux中的awk使用详解
  • 深度解读《实施“人工智能+”行动的意见》:一场由场景、数据与价值链共同定义的产业升级
  • 【8】C#上位机---泛型、委托delegate与多线程Task
  • 2025年代理IP服务深度评测:三大平台横评,谁是最强业务助手?
  • 检查数据集格式(77)
  • 计算机二级C语言操作题(填空、修改、设计题)——真题库(16)附解析答案
  • C++基础——模板进阶
  • 【C++题解】关联容器
  • Linux的权限详解
  • 一次死锁的排查
  • 激活函数:神经网络的“灵魂开关”
  • 阅读论文神奇Zotero下载安装教程以及划词翻译(Translate for Zotero)的配置
  • 动态内存管理柔性数组