虚拟机栈即是程序运行时的单位,而堆是数据存储的单位换句话说,栈解决的是程序运行的问题,即程序如何执行,如何处理数据,而堆是解决数据的存储问题,数据存在哪,放在哪

  虚拟机栈细节如下图所示,其中当前栈帧中包含 局部变量表操作数栈动态链接本地返回值。另外对于栈来说,每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个栈帧,栈帧则对应着一次次的java方法调用。栈主管java程序的运行,保存方法的局部变量(8种基本数据类型、对象的引用地址)、部分结果、参与方法的调用和返回

  • 栈的特点

    • 栈是一种快速有效的分配存储方式,其访问速度仅仅次于程序计数器
    • JVM直接对Java栈的操作比较单一,只有两个:
      • 每个方法执行,伴随着进栈
      • 执行结束后出栈工作
    • 对于栈来说,不存在垃圾回收问题
  • 栈可能出现的异常

    • JVM允许java栈的大小是动态的或者是固定不变的

      • 如果采用固定的栈,超过会报出StackOverFlowError
      • 如果是动态的,动态即可以申请到内存中剩余的空间,如果空间不足则爆出OutOfMemoryError
  • 栈的存储单位

    • 每个线程都有自己的栈,栈中的数据都是以栈帧(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)基础知识的更多相关文章

  1. Java虚拟机栈(java stack)

    虚拟机栈(java stack) 百度图片搜索里的动图搜索功能不错,可以搜索一些动图,展示操作数栈的操作过程,比较形象.这点google差点意思 虚拟机栈(jvm stacks)是线程独占的 里面是多 ...

  2. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分, ...

  3. Java 多线程——基础知识

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. java必备基础知识(一)

    学习的一点建议: 每一门语言的学习都要从基础知识开始,学习是一个过程,"万丈高楼平地起",没有一个好的地基,想必再豪华的高楼大厦终究有一天会倒塌.因此,我们学习知识也要打牢根基,厚 ...

  5. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  6. java部分基础知识整理----百度脑图版

    近期发现,通过百度脑图可以很好的归纳总结和整理知识点,本着学习和复习的目的,梳理了一下java部分的知识点,不定期更新,若有不恰之处,请指正,谢谢! 脑图链接如下:java部分基础知识整理----百度 ...

  7. JAVA学习基础知识总结(原创)

    (未经博主允许,禁止转载!) 一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平 ...

  8. Java的基础知识三

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  9. Java编程基础知识总结大全(Ⅱ)

    7.类型转换 精度从高到低 double float long int short(char) byte (1)自动类型转换 将一个低精度---高精度 (2)强制类型转换 将一个高精度---低精度 ...

  10. Java 并发基础知识

    一.什么是线程和进程? 进程: 是程序的一次执行过程,是系统运行程序的基本单元(就比如打开某个应用,就是开启了一个进程),因此进程是动态的.系统运行一个程序即是一个程序从创建.运行到消亡的过程. 在 ...

随机推荐

  1. 强化学习模型实现RL-Adventure

    源代码:https://github.com/higgsfield/RL-Adventure 在Pytorch1.4.0上解决bug后的复现版本:https://github.com/lucifer2 ...

  2. latex三种标准文类book, report, article的章节命令与层次深度

    Latex有三种标准文类:book, report, article. 每种文类的章节命令和层次深度如下: 三种标准文类的章节命令与层次深度 层次深度 层次名 book report article ...

  3. 区块链入门到实战(25)之以太坊(Ethereum) – 以太币单位

    以太币的主要单位是以太/Ether,即一个以太币,以太币的最小单位是wei. 以太币最小单位 wei 是以虚拟币先驱人物:戴伟 Wei Dai 命名,戴伟 W Dai 是一位兴趣广泛的密码学专家,他在 ...

  4. html行内块元素之间的缝隙

    关于html行内块元素之间缝隙的那点儿事情 事情是这样子的,我起初打算验证使用transform属性的标签是否会影响其他的标签的布局,于是写了下面一段代码: <!DOCTYPE html> ...

  5. 无法登陆网站,nginx漏配置

    location / {         try_files $uri $uri/ /index.php?$query_string; }   这条主要是将index.php入口文件重写掉,所以平常我 ...

  6. 0827考试 T1

    Description ​ 有一棵树,每个点有一个权值,找到一个权值最大的"乙烷"模型. ​ "乙烷"模型是指: ​ 其中黑点表示可以有0个或多个点. Samp ...

  7. php中无参函数的RCE

    学习一下php中无符号的问题. 1.无参数 <?php if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { ev ...

  8. 我竟然才知道slf4j里还有个MDC

    大家好久不见,我是walking.今天给大家带来一个日志方面的知识——MDC,不知道大家认识不,反正我是最近刚知道的 初见MDC 前两天看项目中的代码,无意中看到一个自定义的线程池 MDCThread ...

  9. Johnson全源最短路

    例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...

  10. eslint prettier vetur eslint

    VScode (版本 1.47.3)安装 eslint prettier vetur 插件 .vue 文件使用 vetur 进行格式化 在文件 .prettierrc 里写 属于你的 pettier ...