栈区 Stack Area

  栈是运行时的单位,堆是存储单位,栈解决程序的运行问题,即程序如何执行,如何处理数据。

  每个线程在创建时都创建一个该线程私有的虚拟机栈,每个栈里有许多栈帧,一个栈帧对应一个 Java 方法

栈的特点:

  • 每个栈与它所对应的线程生命周期保持一致

  • 栈主管 Java 程序运行,保存方法的局部变量,部分结果,参与方法的调用与返回

  • JVM 对栈的操作只有两种,方法执行入栈和执行结束出栈

  • 栈的访问快速有效,访问速度仅次于程序计数器

  • 对栈来说不存在垃圾回收问题

栈帧

  栈区中的一个栈对应一个线程,栈中的一个栈帧对应一个方法,在栈帧中封装了方法执行的局部变量表、操作数栈、返回地址、动态链接以及一些附加信息,如对程序调优调试信息等。

  在活动的线程中,只有当前正在执行的方法才是有效的,因此该方法对应的栈顶栈帧称为当前栈帧,该方法称为当前方法,定义该方法的类为当前类

  执行引擎所有的字节码指令只针对当前栈帧进行操作。

  如图所示,正在执行的线程所对应的当前线程中,栈帧1 对应的 方法1 调用了 栈帧2 对应的 方法2,方法2 又调用了 方法3,因此当前栈帧入栈。每个栈帧都存有所对应方法的各种信息。当正在执行的 方法3 执行完毕后,当前栈帧把执行结果返回给 栈帧2,当前栈帧出栈,栈帧2 变为当前栈帧,当 栈帧1 也出栈时,该线程执行完毕,执行其他线程。

局部变量表

  局部变量表也称为局部变量数组或本地变量表。

  局部变量表本质上是一个数字数组,主要用于存储方法参数和定义在方法内的局部变量

  • 局部变量表建立在线程私有的栈中,是线程私有数据,不存在安全问题

  • 局部变量表所需的容量大小,在编译器就确定下来,在方法运行期不会改变其大小

  • 方法嵌套调用的次数由栈的大小决定

  • 局部变量表的变量只在当前方法调用中有效,方法调用结束后,方法栈帧销毁,局部变量表随之销毁

操作数栈

  操作数栈也成为了表达式栈。

  操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的储存空间。

  • 栈中的任何一个元素可以是任意的 Java 数据类型

  • 操作数栈只能通过标准的入栈出栈操作来完成数据访问,不支持索引

  • 如果被调用方法带有返回值,返回值会被压入当前栈帧的操作数栈中,并更新程序计数器的下一条指令

动态链接

  每个栈帧内部包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用的目的就是为了支持当前方法的代码实现动态链接。

  动态链接的作用就是为了将符号引用转换为方法的直接引用,当一个方法调用其他方法时,就通过常量池中指向方法的符号引用完成。

方法返回地址

  当一个方法被执行后,有两种方式退出这个方法。

  正常完成出口:执行引擎遇到任意一个方法返回的字节码指令,产生返回值传递给上层的方法调用者。

  异常完成出口:在方法执行过程中遇到了异常,并且这个异常没有在方法体内得到处理,只要在本方法的异常表中没有搜索到匹配的异常处理器,就会导致方法退出。异常完成出口的方式退出,不会给它的调用者产生任何返回值。

  无论采用何种方式退出,在方法退出之前,都需要返回到方法被调用的位置,程序才能继续执行,方法返回时可能需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。

JVM学习笔记——栈区的更多相关文章

  1. JVM学习笔记:虚拟机的类加载机制

    JVM类加载机制分两部分来总结: (1)类加载过程 (2)类加载器 一.JVM类加载过程 类的加载过程:加载 →连接(验证 → 准备 → 解析)→ 初始化. 类的生命周期:加载 →连接(验证 → 准备 ...

  2. JVM学习笔记:字节码执行引擎

    JVM学习笔记:字节码执行引擎 移步大神贴:http://rednaxelafx.iteye.com/blog/492667  

  3. JVM学习笔记(四)------内存调优【转】

    转自:http://blog.csdn.net/cutesource/article/details/5907418 版权声明:本文为博主原创文章,未经博主允许不得转载. 首先需要注意的是在对JVM内 ...

  4. JVM学习笔记(四)------内存调优

    首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提 ...

  5. java jvm学习笔记七(jar包的代码认证和签名)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前言: 如果你循序渐进的看到这里,那么说明你的毅力提高了,jvm的很多东西都是比较抽像的,如果不找相对应的代码来辅助理解 ...

  6. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  7. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  8. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  9. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

随机推荐

  1. Struts2之处理请求参数

    时间:2017-1-11 11:05 --Struts2中获取请求参数(重点)1.Struts2是一个MVC框架,那么分别表示什么?    View:JSP    Model:Action    Co ...

  2. C程序设计学习笔记(完结)

    时间:2015-4-16 09:17 不求甚解,每有会意,欣然忘食.学习的过程是痛苦的 第1章    程序设计和C语言     第2章    算法--程序的灵魂   -算法的五个特点          ...

  3. git《一》

    org.eclipse.jgit.api.errors.TransportException: https://gitee.com/wbweb/springboot_vue.git: Authenti ...

  4. ubuntu开机自启设置 Ubuntu16.04下测试OK

    在~/.config/autostart/目录下,添加xxx.desktop文件,内容如下: [Desktop Entry] Type=Application Name=start apps NoDi ...

  5. 将 VS2017下开发的程序, 部署到其他电脑上运行

    关键步骤:设置Release,如下图 如果无法直接执行,则安装ALI213-Microsoft.Visual.C++.2017.Redistributable.Package.x86.x64

  6. configparser生成模块写

    # -*-coding:utf-8-*-__author__ = "logan.xu"#写配置文件import configparserconfig = configparser. ...

  7. 启动线程组报错:Error occurred starting thread group :test_1, error message:Invalid duration 0 set in Thread Group:test_1, see log file for more details

    线程组基础信息都已经配置好,启动时报错,如下图: 排查原因:勾选了线程组调度器,并未设置参数 解决方案:取消勾选或者设置参数

  8. Linux新加磁盘并挂载到目录

    步骤:1.分区  ----> 2.格式化  ----> 3.挂载 一.查看当前情况 1. 2. 二.磁盘分区 fdisk /dev/sdb 1.输入n,表示添加一个新的分区 2. e ex ...

  9. Django实现基本的页面分页

    1.视图views.py from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage def index(requ ...

  10. 数据结构(c++)(第二版) Dijkstra最短路径算法 教学示范代码出现重大问题!

    前言 去年在数据结构(c++)的Dijkstra教学算法案例中,发现了一个 bug 导致算法不能正常的运行,出错代码只是4行的for循环迭代代码. 看到那里就觉得有问题,但书中只给了关键代码的部分,其 ...