iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JVM中的栈和局部变量是怎么样的
  • 710
分享到

JVM中的栈和局部变量是怎么样的

2023-06-17 13:06:25 710人浏览 泡泡鱼
摘要

这篇文章给大家介绍JVM中的栈和局部变量是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核

这篇文章给大家介绍JVM中的栈和局部变量是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核心的重要位置。今天我们就继续深入Java核心这个系列,为您介绍Java中的栈、局部变量及其之间的关系。

Java中的栈

每当启用一个线程时,JVM就为他分配一个Java栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。

每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。

Java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况。

像方法区和堆一样,Java栈和帧在内存中也不必是连续的,帧可以分布在连续的栈里,也可以分布在堆里

Java栈的组成元素——栈帧

栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。

局部变量区 局部变量区被组织为以一个字长为单位、从0开始计数的数组,类型为short、byte和char的值在存入数组前要被转换成int值,而long和double在数组中占据连续的两项,在访问局部变量中的long或double时,只需取出连续两项的***项的索引值即可,如某个long值在局部变量区中占据的索引时3、4项,取值时,指令只需取索引为3的long值即可。

下面就看个例子,好让大家对局部变量区有更深刻的认识。这个图来自《深入JVM》:

public static int runClaSSMethod(int i,long l,float f,double d,Object o,byte b) {             return 0;         }                  public int runInstanceMethod(char c,double d,short s,boolean b) {             return 0;         }

上面代码片的方法参数和局部变量在局部变量区中的存储结构如下图:

JVM中的栈和局部变量是怎么样的

上面这个图没什么好说的,大家看看就会懂。但是,在这个图里,有一点需要注意:

runInstanceMethod的局部变量区***项是个reference(引用),它指定的就是对象本身的引用,也就是我们常用的this,但是在runClassMethod方法中,没这个引用,那是因为runClassMethod是个静态方法。

操作数栈和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的。可把操作数栈理解为存储计算时,临时数据的存储区域。下面我们通过一段简短的程序片段外加一幅图片来了解下操作数栈的作用。

int a = 100;

int b = 98;

int c = a+b;

JVM中的栈和局部变量是怎么样的

从图中可以得出:操作数栈其实就是个临时数据存储区域,它是通过入栈和出栈来进行操作的。

帧数据区除了局部变量区和操作数栈外,Java栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在Java栈帧的帧数据区中。
当JVM执行到需要常量池数据的指令时,它都会通过帧数据区中指向常量池的指针来访问它。

除了处理常量池解析外,帧里的数据还要处理Java方法的正常结束和异常终止。如果是通过return正常结束,则当前栈帧从Java栈中弹出,恢复发起调用的方法的栈。如果方法又返回值,JVM会把返回值压入到发起调用方法的操作数栈。

为了处理Java方法中的异常情况,帧数据区还必须保存一个对此方法异常引用表的引用。当异常抛出时,JVM给catch块中的代码。如果没发现,方法立即终止,然后JVM用帧区数据的信息恢复发起调用的方法的帧。然后再发起调用方法的上下文重新抛出同样的异常。

栈的整个结构

在前面就描述过:栈是由栈帧组成,每当线程调用一个Java方法时,JVM就会在该线程对应的栈中压入一个帧,而帧是由局部变量区、操作数栈和帧数据区组成。那在一个代码块中,栈到底是什么形式呢?下面是我从《深入JVM》中摘抄的一个例子,大家可以看看:

代码片段:

JVM中的栈和局部变量是怎么样的

执行过程中的三个快照:

JVM中的栈和局部变量是怎么样的

上面所给的图,只想说明两件事情,我们也可用此来理解Java中的栈:

只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈。

帧中存储了对应方法的局部数据,方法执行完,对应的帧则从栈中弹出,并把返回结果存储在调用方法的帧的操作数栈中。

关于JVM中的栈和局部变量是怎么样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: JVM中的栈和局部变量是怎么样的

本文链接: https://www.lsjlt.com/news/289522.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JVM中的栈和局部变量是怎么样的
    这篇文章给大家介绍JVM中的栈和局部变量是怎么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java开发中,每当我们在程序中使用new生成一个对象,对象的引用存放在栈里,而对象是存放在堆里的。可以看出栈在Java核...
    99+
    2023-06-17
  • Vue 中怎么实现全局变量和局部变量
    本篇文章为大家展示了Vue 中怎么实现全局变量和局部变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。局组件和局部组件1.先定义组件   Vue...
    99+
    2024-04-02
  • C语言——全局变量和局部变量重名了会怎么样
    前言 (1)今天在交流群里面看到这样一个问题: 为什么这个程序中下面我定义的void型函数smart在全局变量前声明了,但是在man函数中调用了smart函数,m的值打印出来还是0。 #includeint m;void smart(...
    99+
    2023-08-30
    学习 c语言
  • Golang函数中的变量作用域:局部变量和全局变量
    Golang函数中的局部变量和全局变量,需要具体代码示例 在Golang中,变量的作用域是非常重要的概念。在函数中,我们常常会遇到局部变量和全局变量的情况。这两者在作用域和使用方式上有一些区别,下面我将详细介...
    99+
    2024-01-18
    函数 变量 Golang
  • java中什么是局部变量
    今天就跟大家聊聊有关java中什么是局部变量,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系...
    99+
    2023-06-14
  • python中全局变量和局部变量有什么区别
    python中全局变量和局部变量有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;...
    99+
    2023-06-14
  • JavaScript局部变量与全局变量的作用域是什么
    本文小编为大家详细介绍“JavaScript局部变量与全局变量的作用域是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript局部变量与全局变量的作用域是什么”文章能帮助大家解决疑惑,下面...
    99+
    2024-04-02
  • js局部变量指的是什么
    这篇文章将为大家详细讲解有关js局部变量指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明局部作用域声明的变量称为局部变量(函数内部定义的变量)局部变量只能能使用局部变量。var在函数内部声明的...
    99+
    2023-06-20
  • python局部变量指的是什么
    这篇文章将为大家详细讲解有关python局部变量指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、概念函数内部定义的变量称为局部变量,局部变量只能在定义函数内部使用。局部变量的作用域仅限于定义其...
    99+
    2023-06-15
  • C++ 函数的局部变量和全局变量有什么区别?
    c++++ 局部变量和全局变量的区别:可见性:局部变量仅限于定义函数,而全局变量在整个程序中可见。内存分配:局部变量在栈上分配,而全局变量在全局数据区分配。作用域:局部变量在函数内,而全...
    99+
    2024-04-19
    全局变量 局部变量 c++ 作用域
  • MySQL 中的系统变量与局部变量?
    局部变量的作用域仅限于一组语句或语句块。每当一组语句或语句块完成时,局部变量就会超出范围。例如局部变量可以在存储过程、函数等中使用.与DECLARE关键字一起使用。局部变量的语法如下。DECLARE yourVariableName dat...
    99+
    2023-10-22
  • Java中局部变量和成员变量的区别详解
    目录一. 关于变量1. 概念2. 命名规范3. 作用范围4. 变量分类二. 局部变量1. 概念2. 特点3. 案例三. 成员变量1 概念2. 实例变量3. 静态变量4. 权限修饰符5...
    99+
    2023-05-20
    Java成员变量 Java 局部变量 Java成员变量 局部变量区别
  • jvm线程变化是怎样的
    这篇文章主要介绍“jvm线程变化是怎样的”,在日常操作中,相信很多人在jvm线程变化是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jvm线程变化是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-03
  • 怎么理解python全局变量,局部变量和命名空间
    本篇内容介绍了“怎么理解python全局变量,局部变量和命名空间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python 使用全局和局部变...
    99+
    2023-06-22
  • C语言全局变量和局部变量的示例代码
    目录局部变量全局变量局部变量和全局变量的综合示例在《C语言形参和实参的区别》中提到,形参变量要等到函数被调用时才分配内存,调用结束后立即释放内存。这说明形参变量的作用域非常有限,只能...
    99+
    2023-05-20
    C语言 全局变量 局部变量
  • javascript中局部变量是什么意思
    小编给大家分享一下javascript中局部变量是什么意思,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 在javascript中,局部变量是在函数体内声明的变...
    99+
    2024-04-02
  • VB.NET中怎么操作局部变量
    本篇文章为大家展示了VB.NET中怎么操作局部变量,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。VB.NET开发工具的出现对开发领域提供了一个全新的编写方式。作为程序员来说,他们又多了一种编程语言的...
    99+
    2023-06-17
  • Python中怎么实现函数的局部变量
    本篇文章给大家分享的是有关Python中怎么实现函数的局部变量,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。局部变量当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其...
    99+
    2023-06-17
  • Java中局部变量和成员变量有什么区别
    今天小编给大家分享的是Java中局部变量和成员变量有什么区别,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。目录一. 关于变量 概念 命名规范 作用范围 变量分类二. 局部变量 概念 ...
    99+
    2023-07-06
  • java中局部变量与全局变量的区别有哪些
    本篇文章为大家展示了java中局部变量与全局变量的区别有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、局部变量:局部变量的定义:定义在方法中的变量都是局部变量(main方法也是方法,所以定义...
    99+
    2023-05-31
    java 局部变量 全局变量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作