虚拟机栈(Java Stack)基础知识
虚拟机栈即是程序运行时的单位,而堆是数据存储的单位。换句话说,栈解决的是程序运行的问题,即程序如何执行,如何处理数据,而堆是解决数据的存储问题,数据存在哪,放在哪
虚拟机栈细节如下图所示,其中当前栈帧中包含 局部变量表、操作数栈、动态链接、本地返回值。另外对于栈来说,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,栈帧则对应着一次次的java方法调用。栈主管java程序的运行,保存方法的局部变量(8种基本数据类型、对象的引用地址)、部分结果、参与方法的调用和返回

栈的特点
- 栈是一种快速有效的分配存储方式,其访问速度仅仅次于程序计数器
- JVM直接对Java栈的操作比较单一,只有两个:
- 每个方法执行,伴随着进栈
- 执行结束后出栈工作
- 对于栈来说,不存在垃圾回收问题
栈可能出现的异常
- JVM允许java栈的大小是动态的或者是固定不变的
- 如果采用固定的栈,超过会报出StackOverFlowError
- 如果是动态的,动态即可以申请到内存中剩余的空间,如果空间不足则爆出OutOfMemoryError
- JVM允许java栈的大小是动态的或者是固定不变的
栈的存储单位
- 每个线程都有自己的栈,栈中的数据都是以栈帧(Stack Frame)的格式存在
- 每个线程上正在执行的方法都对应一个栈帧。注意是一个函数方法对应一个栈帧
- 栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据结果,不能和平时使用的那种栈相比较,平时使用的是数据区太小。现在是一个操作步骤组成的栈帧
- 对于递归来说,递归一次就相当于新建一个栈帧。如上图所示,栈帧中保存着很多数据
栈的运行原理
- JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,并且遵循先进后出,后进先出的原则
- 在一条活动的线程中,一个时间点上,只有一个活动的栈帧,即只有当前在执行的方法的栈帧(顶部栈帧)是有效的,这个栈帧被称之为当前栈帧(Current Frame),与当前栈帧对应的方法就是当前方法(Current Method),定义这个方法的类就是当前类(Current Class)
- 执行引擎运行的所有字节码指令只针对当前帧进行操作
- 如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前帧
- 不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在一个栈帧之中引用另外一个线程的栈帧
- 如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧冲洗成为当前栈帧
- java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令,另外一种是抛出异常,不管使用哪种方式,都会导致栈帧被弹出
运行下图所示:首先是一个方法对应一个栈帧,当方法1调用方法2的时候,会将方法2入栈,然后方法3入栈,最后到了方法4,当方法4执行完成后,顺序返回,最终到方法1收到结果,运行结束

一个简单的调用demo
public class CurrentFrameTest{
public void methodA(){
System.out.println("当前栈帧对应方法->methodA");
methodB();
System.out.println("当前栈帧对应方法->methodA");
}
public void methodB(){
System.out.println("当前栈帧对应方法->methodB");
}
}
附:JVM学习目录
虚拟机栈(Java Stack)基础知识的更多相关文章
- Java虚拟机栈(java stack)
虚拟机栈(java stack) 百度图片搜索里的动图搜索功能不错,可以搜索一些动图,展示操作数栈的操作过程,比较形象.这点google差点意思 虚拟机栈(jvm stacks)是线程独占的 里面是多 ...
- JAVA相关基础知识
JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...
- Java 多线程——基础知识
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java必备基础知识(一)
学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...
- 什么才是java的基础知识?
近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...
- java部分基础知识整理----百度脑图版
近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...
- JAVA学习基础知识总结(原创)
(未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...
- Java的基础知识三
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- Java编程基础知识总结大全(Ⅱ)
7.类型转换 精度从高到低 double float long int short(char) byte (1)自动类型转换 将一个低精度---高精度 (2)强制类型转换 将一个高精度---低精度 ...
- Java 并发基础知识
一.什么是线程和进程? 进程: 是程序的一次执行过程,是系统运行程序的基本单元(就比如打开某个应用,就是开启了一个进程),因此进程是动态的.系统运行一个程序即是一个程序从创建.运行到消亡的过程. 在 ...
随机推荐
- C++ Templates (Part I 基本概念 The Basics)
C++ 模板 (C++ Templates) 目录 C++ 模板 (C++ Templates) 第一部分 基本概念 (The Basics) 第一部分章节目录 参考资料 第一部分 基本概念 (The ...
- Kubernetes 中 Informer 的使用
原文链接:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247485580&idx=1&sn=7392dbadf ...
- Cirros镜像
Openstack的开发,基本都使用这个image来测试,因为他比较小,只有10M. 镜像介绍 镜像的地址: https://launchpad.net/cirros/trunk/0.3.0/+dow ...
- Kafka内部实现原理
Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成.是由Apache软件基金会开 ...
- Python协程之asyncio
asyncio 是 Python 中的异步IO库,用来编写并发协程,适用于IO阻塞且需要大量并发的场景,例如爬虫.文件读写. asyncio 在 Python3.4 被引入,经过几个版本的迭代,特性. ...
- 高可用集群corosync+pacemaker之crmsh使用(一)
上一篇博客我们聊了下高可用集群corosync+pacemaker的相关概念以及corosync的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13585 ...
- 【Android】Listview返回顶部,快速返回顶部的功能实现,详解代码。
作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先给大家看一下我们今天这个最终实现 ...
- JetBrain破解
https://blog.csdn.net/u014044812/article/details/78727496 https://jetlicense.nss.im/ https://zhile.i ...
- Combine 框架,从0到1 —— 4.在 Combine 中使用通知
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 4.在 Combine 中使用通知. 内容概览 前言 让通知处理代码使用 Combine 总结 ...
- css3渐变色实现小功能 ------ css(linaer-gradient)
由沿直线两种或多种颜色之间的渐进转换的图像.它的结果是数据类型的对象,这是一种特殊的类型. 与任何梯度一样,线性梯度没有内在维度 ; 即,它没有天然或优选的尺寸,也没有优选的比例.其具体尺寸将与其适用 ...