JVM内存模型/运行时数据区域

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

java虚拟机管理这块内存,所以我们也叫运行时数据区域

总览

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

程序计数器

JVM内存模型/运行时数据区域,JVM,jvm,java


注意:程序计数器记录字节码的内存地址,这个内存地址是怎么来的?
在前几篇中 字节码通过 .class文件 由类加载器 加载到方法区中(在解析那一步 将引用地址替换成堆内存里面的内存地址)
如下:
JVM内存模型/运行时数据区域,JVM,jvm,java

字节码中每一行都用地址标识,程序计数器就像是一个地址指示器,告诉执行程序 下一行去执行哪里。

java虚拟机的多线程是线程轮流切换 并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,处理器只会执行一条线程中的指令。 所以 为了线程切换后能恢复到正常位置 每个线程都需要一个独立的程序计数器,这就是为什么 程序计数器不能像堆 方法区那样 多线程共享

这篇博客的读者 一定要理解透这一点。


java虚拟机栈

JVM内存模型/运行时数据区域,JVM,jvm,java

栈这个数据结构是个单向的,你可以把它想象成一个竖着的一边开口的箱子。它是先进后出。

看上图的Demo: main 调用a , a调用b ,b调用c。

那么在栈里面就是 mian 先入栈,后面依次是 a b c 入栈, 然后c先被执行完 执行完之后 c 出栈,后面 b a main 依次出栈。

这个时候新手可能会蒙蔽一下:a 调用 b 不是a先执行吗? 这里要注意,执行b方法 这个过程是 执行a方法中的一部分,a调用b的时候a开始执行 但是没执行完 b执行完之后 还在a的方法里面 再往下走 a才执行完


上面就是方法执行过程中栈的逻辑,每执行一个方法 就是一个栈内部栈帧入栈和出栈的过程。

然后我们来学习一下 java虚拟机栈内部一个栈帧由哪些组成:

局部变量表
局部变量表里面存放着,运行过程中所有的局部变量,我们知道 每执行一个方法就会创建一个栈帧,那么这个方法里面的局部变量自然要存入栈帧里面,所以在栈帧里面就创建一个局部变量表来专门存储这些局部变量,方法结束 栈帧也就出栈结束了。

顺便说一句 一个方法一般都会有 方法参数,参数变量也会存在这里。

操作数栈
操作数栈你可以把它理解成一个临时存放数据的区域,虚拟机在执行字节码指令的时候 需要把一些数据临时存起来备用,
比如我们交换 a和 b的值 在计算机里面 你需要把a的值先临时放到某个地方 然后把b的值给a 再从那个临时存放点 把a的值拿出来给b
这种执行指令时留的一点余地 就是操作数栈的作用

帧数据
帧数据不同的虚拟机有差异
这里面最主要的需要了解的两个:

  • 动态链接:在字节码指令中,一个类可能需要调用其他类的方法或者属性,这时候就需要用动态链接 用一个映射把其他类的方法信息引进来
  • 方法出口:上面说过一个方法执行完 就是一个栈弹出的过程,但是弹出以后 虚拟机会疑惑 此时线程执行到哪里了?? 这里就需要在方法出口中记录方法执行完后 下一步的位置信息。

本地方法栈

本地方法栈和虚拟机栈发挥的作用很相似,只不过虚拟栈针对的是java代码编译后的字节码

本地方法栈针对的是 虚拟机本身的底层已经编写好的 native 方法。文章来源地址https://www.toymoban.com/news/detail-800248.html

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

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

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

相关文章

  • JVM | Java内存区域

    以上笔记基于JavaGuide整理 JDK 1.8: 线程私有 的:程序计数器,虚拟机栈,本地方法栈 线程共享 的:堆,方法区(元空间),直接内存 (非运行时数据区的一部分) 程序计数器有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而 实现代码的流程控制 ,如:顺

    2024年02月08日
    浏览(81)
  • JVM——Java 内存区域详解

    如果没有特殊说明,都是针对的是 HotSpot 虚拟机。 基本问题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) 拓展问题 String 类和常量池 8 种基本

    2024年02月13日
    浏览(43)
  • JVM篇--Java内存区域高频面试题

    首先我们要知道java堆空间的产生过程: 即当通过java命令启动java进程的时候,就会为它分配内存,而分配内存的一部分就会用于创建堆空间,而当程序中创建对象的时候 就会从堆空间来分配内存,所以堆空间存放的主要是对象和数组; 而GC 其实说白了就是java虚拟机回收对象

    2024年02月01日
    浏览(52)
  • Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发

    2024年02月12日
    浏览(47)
  • 深入理解 JVM 之——Java 内存区域与溢出异常

    更好的阅读体验 huge{color{red}{更好的阅读体验}} 更好的阅读体验 本篇为深入理解 Java 虚拟机第二章内容,推荐在学习前先掌握基础的 Linux 操作、编译原理、计算机组成原理等计算机基础以及扎实的 C/C++ 功底。 该系列的 GitHub 仓库:https://github.com/Doge2077/learn-jvm Java 虚拟机在

    2024年02月09日
    浏览(63)
  • JVM - 运行时数据区域

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

    2024年02月15日
    浏览(33)
  • JVM原理:JVM运行时内存模型(通俗易懂)

    做了几年开发,平时除了写代码造BUG和修复BUG之外,偶尔也会遇到反馈说程序较慢问题,要对程序性能排查与优化就得更深入学习,学习JVM可以帮助我们加深对JAVA的理解,让我们具备一定的性能排查与调优的能力,无非就是让程序别太卡或者别挂了,那挂了目前我遇到的主要

    2024年02月08日
    浏览(54)
  • JVM运行时五大数据区域详解

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

    2024年02月13日
    浏览(44)
  • JVM零基础到高级实战之Java内存区域本地方法栈

    JVM零基础到高级实战之Java内存区域本地方法栈 JVM零基础到高级实战之Java内存区域本地方法栈 本地方法栈是什么? 用于作用域本地方法执行的一块Java内存区域 为什么要有本地方法栈? 与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部

    2024年02月09日
    浏览(41)
  • JVM运行时数据区——堆内的区域分布

    1.堆内的区域分布 堆是运行时数据区 最大 的一块区域, 主要用来存放对象 ,堆是所有 线程公用 的,在JVM 启动时就被创建 ,堆的 空间是可以调整 的,是GC(垃圾回收)的 重点区域 。 堆的内存空间分区:新生代+老年代 新生代又分为Eden(伊甸园)和Survivor(幸存者)区。  

    2024年02月16日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包