栈区 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. servlet中servletContext的五大作用(二)

    1.    获取web的上下文路径 2.    获取全局的参数 3.    作为域对象使用 4.    请求转发 5.    读取web项目的资源文件 package day10.about_serv ...

  2. 算法入门 - 链表的实现及应用(Java版本)

    之前我们学习了动态数组,虽然比原始数组的功能强大了不少,但还不是完全纯动态的(基于静态数组实现的).这回要讲的链表则是正儿八经的动态结构,是一种非常灵活的数据结构. 链表的基本结构 链表由一系列单一的 ...

  3. etcd raft 处理流程图系列3-wal的存储和运行

    存储和节点的创建 raftexample中的存储其实有两种,一个是通过raft.NewMemoryStorage()进行创建的raft.raftStorage,关联到单个raft节点,另一个是通过ne ...

  4. OVN架构

    原文地址 OVN架构 1.简介 OVN,即Open Virtual Network,是一个支持虚拟网络抽象的系统. OVN补充了OVS的现有功能,增加了对虚拟网络抽象的原生(native)支持,比如虚 ...

  5. JAVAWEB开发批量删除,SSM的几种情况

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. T-SQL - query03_去重查询|模糊查询|排序|分组|使用函数

    时间:2017-09-29 整理:byzqy 本篇仍以"梁山好汉"数据表为例,介绍几个常用的 T-SQL 查询语句: 去重查询,关键字:distinct 使用通配符模糊查询,关键字 ...

  7. Qt 自定义事件

    Qt 自定义事件很简单,同其它类库的使用很相似,都是要继承一个类进行扩展.在 Qt 中,你需要继承的类是 QEvent. 继承QEvent类,你需要提供一个QEvent::Type类型的参数,作为自定 ...

  8. Redis核心原理与实践--字符串实现原理

    Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令: > SET msg "hello wolrd" 该命令将键"msg&q ...

  9. 如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)

    亲测有效的更改RHEL7或CentOS 7的网卡名称的方法, 按照以下4步来操作就可以实现! Step 1 :网卡配置文件名称重命名为eth0[root@localhost ~]# ifconfige ...

  10. elementUI+nodeJS环境搭建

    一. ElementUI简介 我们学习VUE,知道它的核心思想式组件和数据驱动,但是每一个组件都需要自己编写模板,样式,添加事件,数据等是非常麻烦的, 所以饿了吗推出了基于VUE2.0的组件库,它的名 ...