JVM方法区的内部结构

news2025/4/19 10:32:11

JVM 中方法区的大致区域浏览图:

《深入理解 Java 虚拟机》书中对方法区( Method Area) 存储内容描述如下:它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等。

  • 类型信息

对每个加载的类型(类 class、接口 interface、枚举enum、注解annotation),JVM 方法区中存储以下类型信息:

  1. 这个类型的完整有效名称(全名=包名.类名)

  2. 这个类型直接父类的完整有效名(对于 interface 或是 java.lang.Object,都没有父类)

  3. 这个类型的修饰符(public,abstract ,final 的某个子集)

  4. 这个类型直接接口的一个有序列表

  • 域(Field)信息

  1. JVM 必须在方法区中保存类型的所有域的相关信息以及域的声明顺序。

  2. 域的相关信息包括:域名称、域类型、域修饰符(public,private,protected,static,final,volatile,transient 的某个子集)

  • 方法(Method) 信息JVM 必须保存所有方法的以下信息,同域信息一样包括声明顺序:

  1. 方法名称

  2. 方法的返回类型

  3. 方法参数的数量和类型(按顺序)

  4. 方法的修饰符(public ,private, protected , static ,final, synchronized, native,abstract 的一个子集)

  5. 方法的字节码(bytecodes)、操作数栈、局部变量表及大小(abstract 和 native方法除外)

  6. 异常表 (abstract 和 native 方法除外)

  • 每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引

  • non-final 的类变量

    • 静态变量和类关联在一起,随着类的加载而加载,他们成为类数据在逻辑上的一部分。

    • 类变量被类的所有实例共享,即时没有类实例时你也可以访问它。

  • 全局常量:static final

被声明为 final 的类变量的处理方法则不同,每个全局常量在编译的时候就会被分配了。

  • 运行时常量池 vs 常量池

    • 方法区中,内部包含了运行时常量池

    • 字节码文件,内部包含了常量池

    • 要弄清楚方法区,需要理解 ClassFile ,因为加载类的信息都在方法区。

    • 要弄清楚方法区的运行时常量池,需要理解清楚 ClassFile 中的常量池。

  • 为什么需要常量池?

一个java源文件中类、接口、编译后产生一个字节码文件。而Java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池,比如:如下的代码:

public class SimpleClass{
    public void sayHello(){
        System.out.println("hello");
    }
}

虽然只有 194 字节,但是里面却使用了 String、 System、PrintStream及 Object 等结构。这里代码量其实已经很小了。如果代码多,应用到的结构会更多!这里就需要常量池了!

小结:常量池,可以看做是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。

  • 运行时常量池

    • 运行时常量池(Runtime Constant Pool) 是方法区的一部分。

    • 常量池表(Constant Pool Table) 是 Class 文件的一部分,用于存放编译期生成的各种字面量与符号应用,这部分内容将在类加载后存放到方法区的运行时常量池中。

    • 在加载类和接口到虚拟机后,就会创建对应的运行时常量池。

    • JVM 为每个已加载到类型(类或接口)都维护了一个常量池。池中的数据项像数组项一样,是通过索引访问的。

    • 运行时常量池中包含多种不同的常量,包括编译器就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。此时不再是常量池中的符号地址了,这里换为真实地址。

      • 运行时常量池,相对于 Class 文件常量池的另一重要特征是:具备动态性。

    • 运行时常量池类似于传统编程语言中的符号表(symbol table),但是它所包含的数据却比符号表要更加丰富一些。
    • 当创建类或者接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所提供的最大值,则 JVM 会抛 OutOfMemoryError 异常

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

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

相关文章

chatGPT 辣么火,你却不会注册

chatGPT 是什么? 一款目前超级火的 AI 对话聊天工具,只是不同于其他的智能聊天机器人那样,他非常的智能。 可以回答你的技术问题、帮你写代码、还能帮你写小说等等,发挥你的想象力,让他干点啥都行。 比如让他帮你用…

Spring循环依赖问题分析

文章目录一、什么是循环依赖?二、Spring内部解决的是那种情况下的循环依赖?三、一级、二级、三级缓存保存的是什么?四、如何使用三级缓存解决循环依赖?五、为什么是三级缓存,二级缓存不行么?六、二级缓存的…

小米AX6S刷OpenWrt,和刷回官网固件

文章目录背景刷成 OpenWrt刷回官网固件Ref简 述: 闲暇,折腾下新购 小米AX6S ,刷下 OpenWrt,初次接触记录下。 本文初发于 “偕臧的小站”,同步转载于此。 背景 miwifi_rb03_firmware_3e872_1.0.54.bin [官方 2022.08.24] miwifi_r…

17. 权重衰退(weight_decay)

之前描述了过拟合的问题,现在介绍一些正则化模型的技术。 正则化:凡事可以减少泛化误差而不是减少训练误差的方法,都可以称作正则化方法。 我们总是可以通过去收集更多的训练数据来缓解过拟合。 但这可能成本很高,耗时颇多&#x…

【OpenCV-Python】教程:4-7 BRIEF( Binary Robust Independent Elementary Features)特征

OpenCV Python BRIEF ( Binary Robust Independent Elementary Features) 【目标】 学习 BRIEF 算法理论 【理论】 我们知道SIFT使用128维向量作为描述符。因为它使用的是浮点数,所以需要512字节。类似地,SURF也需要最少256字…

堪称零瑕疵!仅用了365页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ 是阿里巴巴在2012年开源的分布式消息中间件,作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来已经也被越来越多的国内企业使用。 谁使用ApacheRocketMQ? …

【不知道发啥】Win7网页版使用方法

文章目录网站使用方法测试总结🌈博客主页:Minecraft__Him 💌欢迎关注🎉点赞👍收藏⭐️私信📝评论 网站 https://win7simu.visnalize.com/ 使用方法 如果是蓝屏那就等一下, 等它跳到这个界面 …

硕士毕业进入阿里三年半,离职申请N+3,到手20多万,跳槽到下家涨薪50%,感谢阿里!...

最近这段时间的负能量帖子太多了,今天说点正能量的事。一位前阿里员工说:硕士3.5年,校招进入阿里供应链后端,月初离职,申请拿了n3,一共给了20多万,跳槽的package涨了50%,感谢阿里&am…

当我和ChatGPT聊Everything as Code

以下是我和ChatGPT的聊天原文。一开始还有点惊喜,震惊。越到后面,越感到失望。网络上大肆宣传ChatGPT要代替人类的文章,我怕是专门炒流量赚钱的吧?我个人觉得,它离代替人类,还远着呢。Everything as Code 的…

Stimulsoft Reports.NET 2023.1.0 Crack

Stimulsoft Reports.NET 是一种为在 Windows 窗体应用程序中集成和工作而创建的报告工具。使用我们的报告工具,您可以创建、编辑、查看、导出和打印任何复杂程度的报告。该产品包括一个功能强大、直观易懂的报表设计器和一个交互式查看器。 最大功能 Stimulsoft Rep…

光储直柔———助力实现零碳电力的新型建筑配电系统

光储直柔———助力实现零碳电力的新型建筑配电系统(2021) [引用本文]江亿.光储直柔———助力实现零碳电力的新型建筑配电系统[J].暖通空调,2021, 21(10): 112. 光储直柔PSDF(phot…

记一次CTF测验(web)

目录 01.php 签到题目 题目描述: 解题: 02.php 11? 题目描述: 解题: 03.php get拿来吧你 题目描述: 解题: 04.php 你从哪里来我的朋友 题目描述: 解题: 05.p…

功能测试(九)—— adb命令、Charles手机抓包

目录 目标 一、APP命令格式 1.1 查看已连接的设备列表 1.2 断开连接设备 1.3 无线连接设备 1.4 开启adb服务 1.5 关闭adb服务 1.6 安装软件包 1.7 卸载软件包 1.8 获取包名 1.9 获取当前窗口(注意大小写区分) 1.10 清除缓存 1.11 启动/停止应用 1.12 获取手机日志…

Verilog语法之条件编译指令`ifdef, `ifndef,`else, `elsif, `endif

0、前言 一般情况下,C语言中的每一行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃&…

Canal-1-安装-代码

1总体简介 1 mysql需要开启binlog binlog分类 1.1)statement: 语句级别,binlog 会记录每一次执行写操作的语句。相对于row模式节省空间,但是会产生数据不一致性,例如:update aa set create_timenew(); 如果用binlo…

Java学习笔记7.2.2 事件处理 - Swing常用事件

文章目录零、本讲学习目标一、Swing常用事件二、窗体事件(一)窗体事件概述(二)窗体事件类API概述(三)窗体事件使用方法(四)窗体事件案例演示三、鼠标事件(一)…

【进阶】C语言第一课:深度剖析数据在内存中的存储

目录 前言: 一、数据类型详细介绍: 1.相关知识回顾: 2.类型的基本归类: 整型家族: 浮点型家族: 构造类型: 指针类型: 空类型: 二、整形在内存中的存储: …

PS 更换证件照背景色

哈喽,各位小伙伴!今天我们来学习一下如何更换证件照背景色? 常见证件照 常见的证件照一般有白色、蓝色和红色三种样式,我们拍证件照一般只拍一种,为了节省支出,其他两种颜色就需要我们自己调色处理了 蓝…

计算机毕业设计ssm+vue基本微信小程序的客户资源管理系统

项目介绍 基于Vue技术的客户资源管理系统是对客户的一些资料进行有效的管理, 它将企业的经营管理以客户为中心,通过系统管理员就可以轻松有效的对客户的信息进行操作管理。从而实现客户资料的一致性、准确性,查询的及时性等等。 该系统提供了客户管理、系统管理、合同管理、…

Java学习笔记7.1.2 初探Swing世界 - 布局管理器

文章目录零、本讲学习目标一、布局管理器二、边框布局管理器(BorderLayout)(一)边框布局管理器概述(二)边框布局管理器API文档(三)边框布局管理器使用方法(四&#xff09…