JVM 每个区域分别存储什么数据?

JVM(Java Virtual Machine)的运行时数据区(Runtime Data Areas)被划分为几个不同的区域,每个区域都有其特定的用途和存储的数据类型。以下是 JVM 各个区域存储数据的详细说明:

1. 程序计数器 (Program Counter Register)

  • 存储内容:

    • 当前线程正在执行的 Java 方法的 字节码指令的地址(行号)。
    • 如果当前线程正在执行的是 Native 方法,程序计数器的值为 undefined (空)。
  • 特点:

    • 线程私有:每个线程都有自己独立的程序计数器。
    • 非常小:占用内存空间非常小。
    • 唯一:是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
  • 作用:

    • 控制程序的执行流程:JVM 通过程序计数器来控制程序的执行顺序,实现分支、循环、跳转、异常处理、线程恢复等功能。
    • 线程切换:Java 虚拟机的多线程是通过线程轮流切换、分配处理器执行时间来实现的。在任何一个确定的时刻,一个处理器(或一个内核)只会执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。

2. 虚拟机栈 (VM Stack)

  • 存储内容:

    • 栈帧 (Stack Frame): 每个方法调用都会创建一个栈帧,用于存储方法的局部变量、操作数栈、动态链接、方法出口等信息。方法执行完毕后,栈帧会被销毁(出栈)。
      • 局部变量表 (Local Variable Table):
        • 存放方法参数和方法内部定义的局部变量。
        • 基本数据类型变量:直接存储值。
        • 引用类型变量:存储对象的引用(地址)。
        • 局部变量表的大小在编译时确定。
      • 操作数栈 (Operand Stack):
        • 一个后入先出 (LIFO) 栈,用于存放方法执行过程中的操作数和中间结果。
        • 例如,执行加法操作时,会将两个操作数压入操作数栈,然后弹出两个操作数进行计算,并将结果压入操作数栈。
      • 动态链接 (Dynamic Linking):
        • 指向运行时常量池中该栈帧所属方法的引用。
        • 用于支持方法调用过程中的动态链接(例如,解析方法调用、接口调用等)。
      • 方法出口 (Return Address):
        • 记录方法返回时应该跳转到的指令地址。
        • 正常返回:返回到调用者的指令地址。
        • 异常返回:返回到异常处理器的指令地址。
      • 附加信息: 可能包含一些附加信息, 例如调试信息等.
  • 特点:

    • 线程私有:每个线程都有自己的虚拟机栈。
    • 后入先出 (LIFO):栈帧的创建和销毁遵循后入先出的原则。
    • 速度快:访问速度仅次于程序计数器。
    • 大小:栈的大小可以是固定的,也可以是动态扩展的。
  • 异常:

    • StackOverflowError: 如果线程请求的栈深度大于虚拟机允许的深度,抛出此异常(例如,无限递归调用)。
    • OutOfMemoryError: 如果虚拟机栈可以动态扩展,但无法申请到足够的内存,抛出此异常。

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

  • 存储内容:
    • 与虚拟机栈类似,但用于支持 native 方法(使用 C、C++ 等编写的方法)的执行。
    • 存储 native 方法的局部变量、参数、返回值等信息。
  • 特点:
    • 线程私有:每个线程都有自己的本地方法栈。
    • 具体的实现方式由虚拟机决定(HotSpot VM 中,本地方法栈和虚拟机栈是合二为一的)。
  • 异常:
    • StackOverflowError
    • OutOfMemoryError

4. 堆 (Heap)

  • 存储内容:

    • 对象实例: 几乎所有的对象实例都在堆上分配内存。
    • 数组: 数组也在堆上分配内存。
  • 特点:

    • 线程共享:所有线程共享同一个堆。
    • 最大:是 JVM 中最大的一块内存区域。
    • 垃圾回收:是垃圾回收的主要区域。
    • 逻辑连续:逻辑上是连续的,物理上可以不连续。
    • 划分:通常划分为新生代(Young Generation)和老年代(Old Generation)。
      • 新生代:存放新创建的对象。
        • Eden 区:大多数对象首先在 Eden 区分配。
        • Survivor 区 (From Survivor 和 To Survivor):存放经过一次 Minor GC 后仍然存活的对象。
      • 老年代:存放生命周期较长的对象,或大对象。
  • 异常:

    • OutOfMemoryError: 如果堆中没有足够的内存分配给新的对象,并且堆也无法再扩展时,抛出此异常。

5. 方法区 (Method Area)

  • 存储内容:

    • 类信息:
      • 类的全限定名
      • 类的父类
      • 类的接口
      • 类的修饰符
      • 类的字段信息
      • 类的方法信息
      • 类的注解信息
    • 常量:
      • 编译时常量(例如,final 修饰的基本类型或字符串字面量)。
      • 运行时常量(例如,String.intern() 方法返回的字符串)。
    • 静态变量:
      • 类变量(static 修饰的变量)。
    • 即时编译器编译后的代码 (JIT Compiled Code):
      • 热点代码(经常执行的代码)会被 JIT 编译器编译为本地机器码,并缓存在方法区中。
  • 特点:

    • 线程共享:所有线程共享同一个方法区。
    • 非堆 (Non-Heap): 在 HotSpot VM 中,方法区也被称为“非堆”。
    • 永久代/元空间:
      • JDK 1.7 及之前: HotSpot VM 使用“永久代”(Permanent Generation)来实现方法区。永久代使用 JVM 内存。容易出现 OutOfMemoryError: PermGen space
      • JDK 1.8 及之后: HotSpot VM 使用“元空间”(Metaspace)来实现方法区。元空间使用本地内存(Native Memory),不容易出现 OutOfMemoryError,但需要注意防止本地内存耗尽。
    • 运行时常量池 (Runtime Constant Pool): 方法区的一部分,存放编译期生成的各种字面量和符号引用,以及运行时产生的常量。
    • 垃圾回收: 方法区也会进行垃圾回收,主要回收废弃的常量和无用的类。
  • 异常:

    • OutOfMemoryError: 如果方法区无法满足内存分配需求,抛出此异常。
    • JDK 1.7 及之前,如果永久代空间不足,会抛出 OutOfMemoryError: PermGen space
    • JDK 1.8 及之后,如果元空间不足,会抛出 OutOfMemoryError: Metaspace

总结:

区域存储内容线程共享性
程序计数器当前线程正在执行的字节码指令的地址(行号)。如果是 Native 方法,则值为空 (Undefined)。私有
虚拟机栈每个方法调用对应一个栈帧。栈帧中存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量表存放方法参数和局部变量。操作数栈用于存放方法执行过程中的操作数和中间结果。私有
本地方法栈与虚拟机栈类似,但用于支持 native 方法的执行。私有
对象实例、数组。共享
方法区类信息(类名、父类、接口、字段、方法、注解等)、常量、静态变量、即时编译器编译后的代码。运行时常量池是方法区的一部分,存放编译期生成的各种字面量和符号引用,以及运行时产生的常量。共享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中shared_ptr 是线程安全的吗?

在 C 中,shared_ptr 的线程安全性和实现原理可以通过以下方式通俗理解: 1. shared_ptr 是线程安全的吗? 答案:部分安全,需分场景! 安全的操作: 引用计数的增减:多个线程同时复制或销…

什么是 CSSD?

文章目录 一、什么是 CSSD?CSSD 的职责 二、CSSD 是如何工作的?三、CSSD 为什么会重启节点?情况一:网络和存储都断联(失联)情况二:收到其他节点对自己的踢出通知(外部 fencing&#…

arm64平台下linux访问寄存器

通用寄存器 示例:读取寄存器值 // 用户态程序或内核代码中均可使用 unsigned long reg_value; asm volatile ("mov %0, x10" // 将X10的值保存到reg_value变量: "r" (reg_value) ); printk("X10 0x%lx\n", reg_value);示例&…

超级好用的小软件,连接电脑和手机。

将手机变成电脑摄像头的高效工具Iriun Webcam是一款多平台软件,能够将手机摄像头变成电脑的摄像头,通过简单的设置即可实现视频会议、直播、录制等功能。它支持Windows、Mac和Linux系统,同时兼容iOS和Android手机,操作简单&#x…

Mysql MIC高可用集群搭建

1、介绍 MySQL InnoDB Cluster(MIC)是基于 MySQL Group Replication(MGR)的高可用性解决方案,结合 MySQL Shell 和 MySQL Router,提供自动故障转移和读写分离功能,非常适合生产环境 2、部署 …

PERL开发环境搭建>>Windows,Linux,Mac OS

特点 简单 快速 perl解释器直接对源代码程序解释执行,是一个解释性的语言, 不需要编译器和链接器来运行代码>>速度快 灵活 借鉴了C/C, Basic, Pascal, awk, sed等多种语言, 定位于实用性语言,既具备了脚本语言的所有功能,也添加了高级语言功能 开源.免费 没有&qu…

ubuntu改用户权限

在 Linux 系统中,赋予普通用户 sudo 权限可以让他们执行一些需要 root 权限的命令,而不需要频繁切换到 root 用户。以下是具体步骤: 创建用户(useradd和adduser两种方式) 首先,需要创建一个新的用户。可以使用 adduser 或 usera…

蓝桥杯 web 学海无涯(axios、ecahrts)版本二

答案: // TODO: 待补充代码// 初始化图表的数据,设置周视图的初始数据 option.series[0].data [180, 274, 253, 324, 277, 240, 332, 378, 101]; // 周数据(每周的总学习时长) option.xAxis.data ["2月第1周", "…

Java 大视界 -- Java 大数据在智慧文旅虚拟场景构建与沉浸式体验增强中的技术支撑(168)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

API vs 网页抓取:获取数据的最佳方式

引言 在当今数字化时代,对于企业、研究人员以及开发人员而言,获取准确且及时的数据是大多数项目成功的关键因素。目前,收集网页数据主要有两种常用方法,即使用 API(应用程序接口)和网页抓取。然而&#xf…

车载以太网网络测试-25【SOME/IP-报文格式-1】

目录 1 摘要2 SOME/IP-报文格式2.1 **Service ID / 16 bits**2.2 **Method ID / Event ID / 16 bits**2.3 **Length / 32 bits**2.4 **Client ID / 16 bits**2.5 Session ID / 16 bits2.6 Protocol Version / 8 bits2.7 Interface Version / 8 bits2.8 Message Type / 8 bits2.…

Python数据可视化-第3章-图表辅助元素的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制,包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范…

小程序30-wxml语法-声明和绑定数据

小程序页面中使用的数据均需要在Page() 方法的 data对象中进行声明定义 在将数据声明好以后,在 WXML 使用 Mustache 语法 ( 双大括号{{ }} ) 将变量包起来,从而将数据绑定 在 {{ }} 内部可以做一些简单的运算,支持如下几种方式: 算数运算三…

ubuntu开启黑屏现象解决

文章目录 前言一、问题描述二、解决方案1. 检查显卡驱动解决步骤: 2. 修复 GRUB 配置解决步骤: 3. 使用恢复模式解决步骤: 三、验证与总结 前言 在使用 Ubuntu 操作系统时,一些用户可能会遇到开机后屏幕黑屏的现象。这种问题可能…

Modbus TCP转Profibus DP网关接防撞雷达与PLC通讯

Modbus TCP转Profibus DP网关接防撞雷达与PLC通讯 在工业自动化领域,通信协议的多样性既是技术进步的体现,也给系统集成带来了挑战。Modbus TCP和Profibus DP是两种广泛应用于不同场景下的通信标准,它们各有优势但也存在着互操作性的需求。本…

分布式锁方案-Redisson

分布式锁:Redisson还实现了Redis文档中提到像分布式锁Lock这样的更高阶应用场景。事实上Redisson并没有不止步于此,在分布式锁的基础上还提供了联锁(MultiLock),读写锁(ReadWriteLock)&#xff…

【AI插件开发】Notepad++ AI插件开发实践:从Dock窗口集成到功能菜单实现

一、项目背景与技术选型 在上篇文章实现"选中即问AI"功能的基础上,本文重点解决AI对话窗口的集成与核心功能菜单的开发。通过Notepad插件体系,我们将实现以下功能矩阵: AI交互系统:支持自然语言提问与任务执行代码智能…

ControlNet-Tile详解

一、模型功能与应用 1. 模型功能 ControlNet-Tile模型的主要功能是图像的细节增强和质量提升。它通过以下几个步骤实现这一目标: 语义分割:模型首先对输入的图像进行语义分割,识别出图像中不同的区域和对象。这一步是为了让模型理解图像的内…

英飞凌高信噪比MEMS麦克风驱动人工智能交互

导言 在英飞凌,我们一直坚信卓越的音频解决方案对于提升消费类设备的用户体验至关重要。我们坚定不移地致力于创新,在主动降噪、语音透传、录音室录音、音频变焦和其他相关技术方面取得了显著进步,对此我们深感自豪。作为MEMS麦克风的领先供…

【Azure】如何使用 Docker CLI 和 Compose 将容器部署到 Azure ACI

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战在云中运行容器可能既困难又令人困惑。有太多选项可供选择,而且还需要理解从虚拟网络到安全性的不同云服务的工作方式。更不用说编排器了。…