JVM规范要求虚拟机实现者自己实现栈帧,本文阐述栈帧的实现方式,有三种

1.堆上分配
2.连续重叠分配
3.混合分配

当调用一个方法的时候,JVM会根据方法信息在内存中划分一个叫做栈帧的区域,那么具体是在哪里呢?本文以如下代码为例

public int m3() {int a=4;int b=5;int c=m4(a,b);return c;
}
public int m4(int a,int b) {return a+b;
}

1.堆上分配
调用一个方法的时候,在堆中的某个位置划分出一个区域,用作栈帧,当m3调用m4的时候,jvm需要为m4分配一块内存,这个内存是在堆中分出来的,m3栈帧使用一个指针指向m4栈帧,没错,如你所想,m3与m4不是连续的
2.连续重叠分配
和我们多数人的想法一样,栈空间是连续的,所以栈帧也是连续的,这只是其一,既然是连续的,那么将m3的操作数栈,作为m4的局部变量表,这样就更加节省内存,这也是常见的栈帧实现方式
3.混合分配
将上面两种方式混搭使用,当栈满了之后,可以采用堆上分配的方式,这样栈的可伸缩性会更好

Java-虚拟机-栈帧相关推荐

  1. java虚拟机栈帧_Java虚拟机,运行时栈帧结构

    业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...

  2. 探究Java虚拟机栈

    前言 Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存.今天我就 Java 虚拟机栈做 ...

  3. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  4. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  5. Java虚拟机栈介绍

    与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期 与线程相同.虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候 ...

  6. Java虚拟机栈详解

    前言 虚拟机栈也称为Java栈,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame) 栈特点基本介绍 Java虚拟机栈属于线程私有,它的生命周期与线程相同(随线程而生,随 ...

  7. 运行时数据区——Java虚拟机栈

    与程序计数器一样, Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同.Java栈以帧为单位保存线程的运行状态.每个方法在执行的时候都会创 ...

  8. 【深入理解JVM】运行时数据区域:java虚拟机栈

    虚拟机栈是线程私有,生命周期与线程相同. java虚拟机栈描述的是Java方法执行的线程内存模型: 每个方法在执行的时候,Java虚拟机栈都会同步创建一个栈帧(stack frame),用于 储存 局 ...

  9. java虚拟机栈(亦篇足以,吴懈可击)

    文章目录 前言 一.虚拟机栈的概述 1.虚拟机栈出现的背景 2.虚拟机栈的概述 3.虚拟机栈中的常见异常 二.栈的存储单位 ※局部变量表 1.局部变量表概况 2. 变量槽Slot 3.局部变量和成员变 ...

  10. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

最新文章

  1. Visual Studio下Qt调用IDL
  2. 网络层:构成超网(CIDR)
  3. Java核心类库篇6——IO
  4. 最长配对(51Nod-2494)
  5. 拉普拉斯变换_拉普拉斯变化(s变换)定义与性质
  6. delphi连接sql server的字符串2011-10-11 16:07
  7. php jq ajax 4个下拉框联动案列,AJAX_AJAX实现下拉框联动,想当年,为了实现三级联动, - phpStudy...
  8. android消息机制—Looper
  9. UNIX网络编程——shutdown 与 close 函数 的区别
  10. Mybatis传递多个参数
  11. 第四季-专题6-Linux内核子系统
  12. 拓端tecdat|R语言进行相关矩阵分析及其网络可视化
  13. 技术分享 | Online DDL 工具 gh-ost
  14. HttpClient 4.1版本,模拟登录,终于成功了(2)
  15. win10玩我的世界java_我的世界win10java下载
  16. 计算机9网络连接不上,本地连接连不上,教您电脑本地连接连不上怎么解决
  17. 计算机基础,Java介绍和环境搭建及Hello World
  18. 周报,当前是第几周 ?
  19. Super Ugly Number
  20. 数据结构(C语言)- 稀疏矩阵的快速乘法

热门文章

  1. c语言空白字符的aci,c语言的保留字符有32个是那些啊???代表什么于是啊??...
  2. android编程设备信息,Android获取当前手机设备信息工具类详解
  3. matlab期中考试卷,湖南大学matlab期中考试试卷分析
  4. php web服务器部署,php – 如何配置apache web服务器以部署laravel 5
  5. dnf维护服务器 安图妮15天,DNF带3次暴走安图恩被封15天 我这数据哪异常了?
  6. 将springboot打包成的jar文件做成windows服务
  7. redis的持久化之RDB的配置和原理
  8. 组件端Apollo配置放到NAS中
  9. 使用xshell6连接linux提示 WARNING! The remote SSH server rejected X11 forwarding
  10. Android开发笔记(九十四)图片的基本加工