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

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.xdnf.cn/news/16372.html

相关文章:

  • Java同步锁性能优化:15个高效实践与深度解析
  • 7月26号打卡
  • C++/CLI与标准C++的语法差异(一)
  • ASP.NET Core MVC中taghelper的ModelExpression详解
  • Spring Boot 3 如何整合 MinIO 实现分布式文件存储?
  • MyBatis-Plus 通用 Service 详解:IService 与 CRUD 操作全解析
  • PYTHON从入门到实践-15数据可视化
  • 【资讯】2025年软件行业发展趋势:AI驱动变革,云原生与安全成核心
  • PHP框架之Laravel框架教程:1. laravel搭建
  • 亚马逊测评采购:如何打造安全的环境,技术基础关键
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 70(题目+回答)
  • Avantage6.6下载与安装教程
  • 差模干扰 共模干扰
  • 【隧道篇 / IPsec】(7.6) ❀ 01. 利用向导快速建立IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • 详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
  • ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)
  • MySQL进阶学习与初阶复习第三天
  • CSS3知识补充
  • 如何高效合并音视频文件(时间短消耗资源少)(二)
  • ICMPv4报文类型详解表
  • 人形机器人指南(八)操作
  • Xinference vs SGLang:详细对比分析
  • MybatisPlus-18.插件功能-分页插件基本用法
  • Jmeter的元件使用介绍:(五)定时器详解
  • 无需云服务器的内网穿透方案 -- cloudflare tunnel
  • 【AI周报】2025年7月26日
  • 什么是ICMP报文?有什么用?
  • Android Data Binding 深度解析与实践指南
  • easy-llm-cli的安装和使用
  • 【web应用】基于Vue3和Spring Boot的课程管理前后端数据交互过程