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

Java学习第七十七部分——JVM运行时数据区

目录

一、前言提要概述

二、核心组件概览

三、详细组件说明

四、内存区域关系图

五、堆内存详细结构——分代模型

五、异常情况示例

六、总结分析


一、前言提要概述

       Java 虚拟机(JVM)在运行 Java 程序时,会将内存划分为多个逻辑区域,每个区域有特定的职责。

二、核心组件概览

JVM 运行时数据区主要分为线程私有区和 线程共享区。

区域类型组成部分线程安全异常类型作用描述
线程私有区程序计数器(PC)线程私有记录当前线程执行的字节码位置
虚拟机栈(JVM Stack)线程私有StackOverflowError
OutOfMemoryError
存储方法调用的栈帧
本地方法栈(Native Stack)线程私有StackOverflowError
OutOfMemoryError
支持 Native 方法调用
线程共享区堆(Heap)线程共享OutOfMemoryError存储所有对象实例和数组
方法区(Method Area)线程共享OutOfMemoryError存储类信息、常量池、静态变量等
运行时常量池(Runtime Constant Pool)线程共享OutOfMemoryError存储字面量和符号引用

三、详细组件说明

1. 程序计数器(Program Counter Register)
   - **作用**:记录当前线程正在执行的字节码指令地址(分支、循环、跳转等)。
   - **特性**:
     - 唯一不会发生 `OutOfMemoryError` 的区域。
     - 线程私有(每个线程独立存储执行位置)。
   - **示例**:若线程执行 `add` 指令,PC 指向该指令的内存地址。

2. 虚拟机栈(JVM Stack)
   - **作用**:存储方法调用的栈帧(Stack Frame),每个方法对应一个栈帧。
   - **栈帧结构**:
     - **局部变量表**:存放方法参数和局部变量(基本类型、对象引用)。
     - **操作数栈**:执行字节码指令的工作区(如加减乘除)。
     - **动态链接**:指向运行时常量池的方法引用。
     - **返回地址**:方法退出后恢复执行的地址。
   - **异常**:
     - `StackOverflowError`:栈深度超过限制(如无限递归)。
     - `OutOfMemoryError`:栈扩展失败(如线程过多)。

3. 本地方法栈(Native Method Stack)
   - **作用**:支持 Native 方法(如 C/C++ 实现)的调用。
   - **特性**:与虚拟机栈类似,但服务于 JNI(Java Native Interface)。
   - **异常**:同虚拟机栈(`StackOverflowError`/`OutOfMemoryError`)。

4. 堆(Heap)
   - **作用**:存储所有对象实例和数组(`new` 关键字创建的对象)。
   - **内存管理**:
     - 由垃圾回收器(GC)自动管理。
     - 分为 **新生代**(Young)和 **老年代**(Old):
       - **新生代**:Eden + Survivor(S0, S1),新对象在此分配。
       - **老年代**:长期存活的对象(经过多次 GC 后存活)。
   - **异常**:`OutOfMemoryError`(堆空间不足)。

5. 方法区(Method Area)
   - **作用**:存储类元数据(类名、方法、字段)、运行时常量池、静态变量、JIT 编译后的代码。
   - **实现演变**:
     - **JDK 1.7 前**:永久代(PermGen),位于堆中。
     - **JDK 1.8+**:元空间(Metaspace),使用本地内存(不再受 JVM 堆限制)。
   - **异常**:`OutOfMemoryError`(元空间耗尽)。

6. 运行时常量池(Runtime Constant Pool)
   - **作用**:存储类文件中的常量池表(字面量、符号引用)。
   - **特性**:
     - 支持动态性(如 `String.intern()` 动态添加常量)。
     - 是方法区的一部分。

四、内存区域关系图

五、堆内存详细结构——分代模型



对象分配流程:
  1. 新对象分配在Eden区。
  2. Eden 满时触发Minor GC:
     - 存活对象复制到Survivor(S0/S1)。
     - 年龄计数器 +1(每熬过一次 GC)。
  3. 年龄达到阈值(默认 15)的对象进入老年代。
  4. 老年代满时触发Full GC(速度慢,影响性能)。

五、异常情况示例

1. `StackOverflowError`

   void infiniteRecursion() {infiniteRecursion(); // 无限递归,耗尽虚拟机栈}

2. `OutOfMemoryError`
   - **堆溢出**:创建大量对象(如 `new byte[1024 * 1024]`)。
   - **元空间溢出**:动态生成大量类(如 CGLib 代理)。

六、总结分析

区域存储内容生命周期垃圾回收
程序计数器字节码指令地址线程生命周期
虚拟机栈栈帧(局部变量/操作数)方法调用周期
对象实例、数组对象存活周期
方法区类元数据、常量池JVM 运行周期✅(卸载类)

ps:JDK 1.8 后方法区由元空间(Metaspace)实现,直接使用本地内存,默认无上限(需监控避免耗尽系统内存)。

http://www.dtcms.com/a/299773.html

相关文章:

  • 三防平板搭载2D扫描头:工业数据采集的革新利器
  • 路由选择工具——IP-Prefix
  • springboot企业级后台管理平台-计算机毕业设计源码02282
  • java网络请求工具类HttpUtils
  • 如何查找php配置文件php.ini
  • URL与URI:互联网世界的“门牌号“与“身份证“
  • 【机器学习深度学习】模型微调:多久才算微调完成?——如何判断微调收敛,何时终止训练
  • Linux库——库的制作和原理(2)_库的原理
  • 微软中国高级架构师步绍鹏受邀为第十四届PMO大会演讲嘉宾
  • gig-gitignore工具实战开发(五):gig add完善
  • 单片机中的三极管
  • write`系统调用
  • 字节跳动正式开源AI智能体开发平台Coze
  • LeetCode——1957. 删除字符使字符串变好
  • 1.安装anaconda详细步骤(含安装截图)
  • Typecho插件开发实战:构建专业级访问日志系统
  • ESP32-idf学习(五)esp32C3移植lvgl①
  • 贝叶斯决策论
  • Spring AI MCP 客户端
  • Django+celery异步:拿来即用,可移植性高
  • SSSM框架相关问题总结
  • 拒绝SQL恐惧:用Python+pyqt打造Excel数据库查询系统
  • [Java恶补day47] 整理模板·考点十【二叉树层序遍历】
  • 快速入门Linux操作系统(一)
  • LeetCode 面试经典 150_数组/字符串_删除有序数组中的重复项(3_26_C++_简单)
  • RabbitMQ--消息丢失问题及解决
  • 是德科技 | AI上车后,这条“高速公路”如何畅通?
  • 如何高效合并音视频文件(时间短消耗资源少)(二)
  • 计网-TCP可靠传输
  • 周末小游戏推荐,离线也能畅玩