【深入浅出-JVM】(6):栈帧

代码


package com.mousycoder.mycode.happy_jvm;

/**

 * @version 1.0

 * @author: mousycoder

 * @date: 2019-06-11 15:45

 */

public class TestStackDeep1 {

    private static int count = 0;

    public static void recursion(long a,long b,long c) {

        long e = 1, f= 2,g =3 ,h=4,i=5,k=6,q=7,x=8,y=9,z=10;

        count++;

        recursion(a,b,c);

    }

    public static void recursion(){

        count++;

        recursion();

    }

    public static void main(String[] args) {

        try {

            recursion(1,2,3);

        } catch (Throwable e) {

            System.out.println("deep of calling = " + count);

            e.printStackTrace();

        }

    }

}

其中 recursion(long a,long b,long c) 方法的栈帧如下,一共13 个long类型的局部变量一共占用 26 个字

原文地址:https://blog.51cto.com/10154395/2419113

时间: 2024-11-03 17:48:36

【深入浅出-JVM】(6):栈帧的相关文章

[jvm解析系列][十一]字节码执行之栈帧,你的字节码是如何运行的?

在之前的章节中我们讲解了jvm的内存分配和管理,class的文件结构,就差之行了.那么从第十一章开始我们就开始讲java虚拟机是如何执行一个class文件的. 首先我们应该明确虚拟机是区别于物理机的一种说法,物理机的执行引擎是建立在处理器,硬件 ,指令集之上的.而我们的虚拟机则由自己实现.在虚拟机中大致分为两种执行方式:解释执行和编译执行. 我们之前讲过,虚拟机运行方法的时候运行在java虚拟机栈里面,里面的存储结构是栈帧,需要了解一个虚拟机如何运行字节码文件的,首先我们需要了解一个栈帧的结构.

JVM 栈帧

 一.栈帧 栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking).方法返回值和异常分派(Dispatch Exception). 栈帧随着方法调用而创建,随着方法结束而销毁--无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束.栈帧的存储空间分配在Java虚拟机栈之中,每一个栈帧都有自己的局部变量表.操作数栈和指向当前方法所属的类的运行时常量池的引用.下载 局部变量表和操作数栈的容量是在编译期确定,并通过方

Jvm(59),虚拟机字节码执行引擎----运行时栈帧结构

后面讲的所有的东西就是对前面所总览的虚拟机栈的进一步理解. 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)[1]的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态连接和方法返回地址等信息.每一个方法从调用开始至执行完成的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程. 每一个栈帧都包括了局部变量表.操作数栈.动态连接.方法返回地址和一些额外的附加信息.在编译程序代码的时候,

[jvm解析系列][十三]字节码指令小节,从字节码看JVM的栈解释器执行过程。

众所周知,JVM以前一直采用的是解释执行,但是后来在历代的版本更迭中也加入了编译执行.所以总的来说JVM是包含了解释执行和编译执行.这一部分不属于JVM的范畴了,已经属于编译了,大多数都是进行词法分析之类的,以后有时间会补充. 同时大家都知道现在大体上分为两种指令集架构,第一种就是基于栈的第二种是基于寄存器的,简单点说,基于寄存器的架构速度更快,但是可移植性不强,但是基于栈的指令集架构虽然慢,但是可移植性很强,大家都知道java本身就是依靠可移植性出名的,所以无可争议的使用了栈的指令集架构.(也

深入浅出 JVM GC(1)

# 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着内存,就像网上有句名言------生活从来都不容易,只不过是有人替你负重前行!是的,GC 在替我们做这些脏活累活,GC 像让我们把精力都放在业务上,而不用每时每刻都在想着内存.现在,GC 也是每个语言的标准配置了.不然谁会去使用这个语言呢? 然而,作为一个合格的程序员,对底层的好奇是进步的动力,如果

JVM堆 栈 方法区详解

一.栈 每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态 栈是由栈帧组成,每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧 只有在调用一个方法时,才为当前栈分配一个帧,然后将该帧压入栈 栈帧帧是由局部变量区.操作数栈和帧数据区组成 java栈上的所有数据都是私有的,任何线程都不能访问另一个线程的栈数据 局部变量区  调用方法时,类型信息确定此方法局部变量区和操作数栈的大小 局部变量区被组织为以一个字长为单位.从0开始计数的数组,类型为

JVM的栈内存

目录 JVM栈之局部变量表:包含参数和局部变量 JVM栈之操作数栈 JVM栈之栈上分配(动态链连接) 每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈.Java栈以帧为单位保存线程的运行状态.虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈. 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池.在线程执行一个方法时,它会跟踪当前类和当前常量池.此外,当虚拟机遇到栈内操作指令时,它对当前帧

jvm虚拟机栈的作用

jvm虚拟机栈的作用 jvm虚拟机栈栈帧的组成 jvm虚拟机栈,也叫java栈,它由一个个的栈帧组成,而栈帖由以下几个部分组成 局部变量表-存储方法参数,内部使用的变量 操作数栈-在变量进行存储时,需要进行入栈和出栈 动态连接-引用类型的指针 方法出口-方法的返回 一段原程序代码 package com.lind.basic; public class Demo1 { static int hello() { int a = 1; int b = 2; int c = a + b; return

深入浅出JVM之垃圾收集算法

判断哪些对象需要被回收 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 但是JVM没有使用此方法,因为此方法无法解决2个对象相互循环引用的问题. 可达性分析算法: 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象