码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【JVM笔记】方法区的内部结构与运行时常量池


    目录

    方法区存储什么

    类型信息

    域(Field)信息

    方法(Method)信息

    non-final的类变量

    全局常量 static final

    运行时常量池

    为什么需要常量池

    常量池中有什么


    方法区存储什么

    《深入理解 Java 虚拟机》书中对方法区(Method Area)存储内容描述如下:

    它用于存储已被虚拟机加载的类型信息、常量、静态变量、即使编译器编译后的代码缓存等

    类型信息

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

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

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

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

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

    域(Field)信息

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

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

    方法(Method)信息

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

    1. 方法名称

    2. 方法的返回类型(或 void)

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

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

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

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

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

    non-final的类变量

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

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

    全局常量 static final

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

    运行时常量池

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

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

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

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

    一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table),包含各种字面量和对类型、域和方法的符号引用

    为什么需要常量池

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

    【JVM笔记】动态链接(或指向运行时常量池的方法引用)_李既白的博客-CSDN博客

    常量池中有什么

    数量值

    字符串值

    类引用

    字段引用

    方法引用

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

  • 相关阅读:
    LM小型可编程控制器软件(基于CoDeSys)笔记二十七:温度电阻通道和DO通道
    【C#设计模式】单例模式
    【js】【爬虫】fetch + json-server 快速搭建爬虫服务器环境及数据后续处理(突破session缓存大小限制)
    【面试题】前端面试小知识 <4>
    【电商项目实战】用户登录(详细篇)
    JavaScript对象方法
    卷积神经网络原理及其C++/Opencv实现(2)
    RSLO:自监督激光雷达里程计(实时+高精度,ICRA2022)
    T1092 求出e的值(信息学一本通C++)
    【云原生】云原生与DevOps的结合:提升软件开发与交付的效率
  • 原文地址:https://blog.csdn.net/lijibai_/article/details/126161538
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号