JVM运行时数据区(上篇)

这篇具有很好参考价值的文章主要介绍了JVM运行时数据区(上篇)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JVM运行时数据区可分为线程共享的堆,方法区和线程独享的虚拟机栈、本地方法栈、程序计时器此外还有一个单独的直接内存,如下图所述:

JVM运行时数据区(上篇),jvm

程序计数器 

程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址。

JVM运行时数据区(上篇),jvm

  • 起始时计数器记录0号位置指令的地址
  • 当0号位置指令执行完成后,计数器记录1号位置指令的地址
  • 当1号指令执行完成后,计数器记录2号位置指令的地址
  • 依此类推,程序计数器主要功能是记录当前线程将要执行的字节码指令的地址

JVM运行时数据区(上篇),jvm

ps:因为每个线程只存储一个固定长度的内存地址,程序计数器是不会发生内存溢出的。

Java虚拟机栈

Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。

如下执行main时相关的java虚拟机栈如下:

JVM运行时数据区(上篇),jvm

 Java虚拟机栈随着线程的创建而创建,而回收则会在线程的销毁时进行。由于方法可能会在不同线。程中执行,每个线程都会包含一个自己的虚拟机栈。

JVM运行时数据区(上篇),jvm

栈帧的组成

JVM运行时数据区(上篇),jvm

局部变量表
  •  NR:编号
  • 起始PC:变量生效的起始位置
  • 长度:变量生效的有效范围,左闭右开 [ )。
  • 序号:变量所在的槽位置

JVM运行时数据区(上篇),jvm槽覆盖特性,即当某一局部变量不再生效时,当前槽可以重写被再次使用。

JVM运行时数据区(上篇),jvm

 操作数栈
  •  操作数栈是栈帧中虚拟机在执行指令过程中用来存放中间数据的一块区域。他是一种栈式的数据结构,如果一条指令将一个值压入操作数栈,则后面的指令可以弹出并使用该值。
  •  在编译期就可以确定操作数栈的最大深度,从而在执行时正确的分配内存大小。

JVM运行时数据区(上篇),jvm

JVM运行时数据区(上篇),jvm 帧数据

动态链接

当前类的字节码指令引用了其他类的属性或者方法时,需要将符号引用(编号)转换成对应的运行时常量池中的内存地址。动态链接就保存了编号到运行时常量池的内存地址的映射关系

JVM运行时数据区(上篇),jvm

方法出口

方法出口指的是方法在正确或者异常结束时,当前栈帧会被弹出,同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中,需要存储此方法出口的地址。

JVM运行时数据区(上篇),jvm

异常表

主要作用是存放代码正常执行和出现异常时字节码指令如何进行跳转的数据

JVM运行时数据区(上篇),jvm

栈溢出 

  • Java虚拟机栈如果栈帧过多,占用内存超过栈内存可以分配的最大大小就会出现内存溢出。
  • Java虚拟机栈内存溢出时会出现StackOverflowError的错误
  • 如果我们不指定栈的大小,JVM 将创建一个具有默认大小的栈。大小取决于操作系统和计算机的体系结构。

JVM运行时数据区(上篇),jvm

 

本地方法栈

  • Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧。
  • 在Hotspot虚拟机中,Java虚拟机栈和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内存上生成一个栈帧,临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来。

JVM运行时数据区(上篇),jvm文章来源地址https://www.toymoban.com/news/detail-796166.html

到了这里,关于JVM运行时数据区(上篇)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM - 运行时数据区域

    并发情况下,会发生线程之间的上下文切换,当 线程1 的CPU时间片用完后,需要程序计数器记录 线程1 的下一条JVM指令的地址,等下一次 线程1 继续运行的时,才能从正确的位置开始继续执行 程序计数器是线程私有的 , 既 一个线程计数器 记录一个 线程 的指令位置 而且程

    2024年02月15日
    浏览(34)
  • JVM系列 运行时数据区

    第一章 运行区实验 JVM(Java虚拟机)运行区是Java程序在运行过程中被JVM所管理的内存区域。它包括了Java程序运行时的堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stacks)、程序计数器和直接内存(Direct Memory)等部分。 堆(Heap)是Java程序运行时用于

    2024年02月08日
    浏览(42)
  • JVM运行时数据区(下篇)

     紧接上篇:JVM运行时数据区(上篇)-CSDN博客  一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。 栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享。 字符串常

    2024年01月17日
    浏览(51)
  • JVM运行时五大数据区域详解

            java虚拟机再执行Java程序的时候把它所拥有的内存区域划分了若干个数据区域。这些区域有着不同的功能,各司其职。这些区域不但功能不同,创建、销毁时间也不同。有些区域为线程私有,如:每个线程都有自己的程序计数器,则程序计数器随着用户线程创建而创

    2024年02月13日
    浏览(45)
  • JVM内存模型/运行时数据区域

    java虚拟机管理这块内存,所以我们也叫运行时数据区域 这里按线程是否共享来分类,所谓线程不共享就是每个线程里面都会配一套 程序计数器 栈, 互相不干涉。 而方法区和堆是线程所有共享 意味着只有一个(这里注意堆是实际概念 方法区是一个虚拟概念) 注意:程序计

    2024年01月18日
    浏览(55)
  • 二、JVM-深入运行时数据区

    计算机体系结构 JVM的设计实际上遵循了遵循冯诺依曼计算机结构 CPU与内存交互图: 硬件一致性协议: MSI、MESI、MOSI、Synapse、Firely、DragonProtocol 摩尔定律 摩尔定律是由英特尔(Intel)创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的晶体

    2024年02月14日
    浏览(39)
  • 说一下 JVM 运行时数据区 ?

    目录 一、程序计数器(Program Counter Register) 二、Java 虚拟机栈(Java Virtual Machine Stacks) 三、本地方法栈(Native Method Stack) 四、Java 堆(Java Heap) 五、方法区(Methed Area) 当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条

    2024年02月21日
    浏览(35)
  • JVM运行时数据区——本地方法栈

    1.本地方法栈 本地方法栈里面存放的是 调用 的本地(Native)的方法,例如hashcode()。 本地方法栈也是线程 私有 的,本地方法是由 C 语言实现的。 如果 线程请求的栈容量 大于 本地方法栈允许的最大容量 则会出现 栈溢出 的问题。 其内存空间可以调整。

    2024年02月16日
    浏览(41)
  • JVM—内存管理(运行时数据区)、垃圾回收

    当JVM类加载器加载完字节码文件之后,会交给执行引擎执行,在执行的过程中会有一块JVM内存区域来存放程序运行过程中的数据,也就是我们图中放的运行时数据区,那这一块运行时数据区究竟帮我们做了哪些工作?我们常说的线上内存泄漏和内存溢出是因为什么?我们今儿

    2024年02月13日
    浏览(41)
  • JVM运行时数据区之堆空间

    一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。堆区在 JVM 启动的时候即被创建 ,其空间大小也就确定了,是 JVM管理的最大一块内存空间 。 《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time dat

    2024年02月16日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包