java虚拟机-02-运行时数据区

本贴最后更新于 3912 天前,其中的信息可能已经时移世改

      类加载后需要将数据保存到内存中,运行时也需要从内存中获取数据,从下图也可以看出运行时数据区是相当重要的一部分,这篇我们会介绍下java虚拟机是如何存储数据、数据是如何和其他模块交互的。

 

一、方法区
1、类被加载后的信息会被存储在方法区内,当程序运行时,虚拟机会查找并使用存储在方法区中的类信息。
2、存储的信息
     a、类:
         I、类的全限定名
         II、类的直接超类的全限定名
         III、类或是接口
         IV、类的访问修饰符
         V、任何直接超接口的全限定名的有序列表
    b、字段:
        I、字段名
        II、字段的类型
        III、字段的修饰符
    c、方法:
        I、方法名
        II、方法的返回类型
        III、方法参数的数量和类型(按声明顺序)
        IV、方法的修饰符
        V、如果方法不是抽象的和本地的,还需要保存

    • 方法的字节码
    • 操作数栈和该方法的栈帧中的局部变量区的大小
    • 异常表

    d、类静态变量
    e、常量池
3、方法表
为了提高访问效率,虚拟机对每个装载的非抽象类,都会生成一个方法表,把它作为的类信息的一部分保存在方法区。方法表是一个数组,它的元素是所有它的实例可能被调用的实例方法的直接引用,包括那些从超类继承过来的实例方法。运行时,可以通过方法表快速搜寻在对象中调用的实例方法的位置。

二、java堆
1、java程序运行时创建的所有类实例或数组都放在堆中。对象的回收由垃圾回收器自动回收,程序无法主动回收对象。
2、对象的数据由它所属的类和其所有超类声明的实例变量组成。它必须能通过该对象引用访问相应的类数据,因此对象中通常会有一个指向方法区中类的指针。
3、下图是堆的一种设计,吧堆分为两部分:一个句柄池,一个对象池,一个对象引用就是一个指向句柄池的本地指针。句柄池的每个条目由两部分:一个指向对象实例变量的指针,一个指向方法区类型数据的指针。

4、数组的存储如下图所示,数组类的名称由两部分组成,每一维用一个方括号“[”表示,用字符串或字符表示元素的类型。堆中的每个数组对象还必须保存数组的长度、数组数据,以及某些指向数组的类数据的引用。

 

三、程序计数器
对于一个运行中的java程序而言,其中的每一个线程都有他自己的pc寄存器,他是在该线程启动时创建的。pc寄存器的大小是一个字长,一次它既能够持有一个本地指针,也能够持有一个returnAddress。当线程执行某个java方法时,pc寄存器的内容总是下一条将被执行的指令的本地指针,也可以是在方法字节码中的相对于该方法的起始指令的偏移量。如果该线程正在执行一个本地方法,则此时pc寄存器的值是“undefined”。

四、java栈
1、每当启动一个新线程时,java虚拟机都会为它分配一个java栈。java栈是以帧为单位保存线程的运行状态。java栈只有两个操作:一帧为单位的压栈和出栈。某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。
2、java方法可以以两种方式完成,一种通过返回return返回的,称为正常返回;一种是通过抛出异常而异常终止的。完成后虚拟机都会将当前帧弹出java栈然后释放掉,这样上一个方法的帧就成为当前帧了。

五、帧栈
1、帧栈由三部分组成:局部变量区、操作数据栈和帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,它们是按字长计算买的。编译器在编译时就确定了这些值并放在了class文件中。而帧数据区的大小依赖于具体的实现。当虚拟机调用一个java方法时,他从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后压入java栈中。
2、局部变量区
局部变量区被组织为一个以字长为单位、从0开始计数的数组。包含对应方法的参数和局部变量。
3、操作数栈
操作数栈也是被组织成一个以字长为单位的数组。通过压栈和出栈来访问。虚拟机把操作数栈作为它的工作区,大多数指令都要从这里弹出数据,执行计算,然后把结果压回操作数栈。
4、帧数据区
    a、支持常量池解析:每当虚拟机要执行某个需要用到常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。
    b、正常方法返回:帧数据区需要帮助虚拟机处理java方法的正常结束或异常终止。
    c、可以将一些其他的数据,比如调试数据放入到帧数据区中。

六、本地方法栈
当程序调用本地方法时,需要通过本地方法接口访问虚拟机的运行时数据区,而任何本地方法接口都会使用某种本地方法栈。当虚拟机调用一个本地方法时,虚拟机会保持java栈不变,不再在线程的java栈栈中压入新的帧,虚拟机只是简单的动态连接并直接调用指定的本地方法。

  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • 编程
    50 引用 • 257 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • gRpc
    10 引用 • 8 回帖 • 55 关注
  • OnlyOffice
    4 引用 • 19 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    164 引用 • 407 回帖 • 523 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    85 引用 • 895 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    103 引用 • 294 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 595 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 693 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 370 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    4 引用 • 55 回帖 • 12 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 406 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 597 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 4 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    106 引用 • 152 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 456 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 604 关注
  • 自由行
    2 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 25 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8207 回帖 • 1 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    228 引用 • 1450 回帖 • 2 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 12 关注