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

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

      类加载后需要将数据保存到内存中,运行时也需要从内存中获取数据,从下图也可以看出运行时数据区是相当重要的一部分,这篇我们会介绍下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 回帖
  • 编程
    53 引用 • 266 回帖 • 3 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 倾城之链
    23 引用 • 66 回帖 • 137 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 545 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • Facebook

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

    4 引用 • 15 回帖 • 453 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 2 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 587 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 9 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1387 回帖 • 283 关注
  • 旅游

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

    90 引用 • 899 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    17 引用 • 236 回帖 • 325 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 432 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 786 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • ngrok

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

    7 引用 • 63 回帖 • 624 关注
  • 创业

    你比 99% 的人都优秀么?

    84 引用 • 1399 回帖 • 1 关注
  • Java

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

    3187 引用 • 8213 回帖
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    25 引用 • 191 回帖 • 16 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注