美文网首页
Java 栈帧

Java 栈帧

作者: 放开那个BUG | 来源:发表于2021-04-04 14:10 被阅读0次

1、前言

前一篇文章重点说了 Java 代码的类加载机制,说明了 .class 文件是怎么说加载 -> 卸载的,但前面的过程主要是对类的加载以及对类变量的初始化赋值,但是类中的方法进行加载后,到底是怎么执行的,还是有很多疑惑。所以我们今天将代码到底是怎么执行的,方法是怎么加载到内存的。

2、步骤

Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。

栈帧包括:局部变量表、操作数栈、动态连接、方法返回地址、附加信息等。


栈帧结构

对于局部变量表来说,它是一组变量值的存储空间,容量以变量槽为基本单位,可以存储 boolean、byte、char、short、int、float、reference(重点)、returnAddress 这8种类型。reference 表示一个对象实例的饮用,虚拟机实现可以通过这个引 用做到两件事情:

  • 一是从根据引用直接或间接地查找到对象在Java堆中的数据存放的起始地址或索引
  • 二是根据引用直接或间接地查找到对象所属数据类型在方法区中的存储的类型信息

我们知道,局部变量表中的局部变量可以作为 GC Roots,当出现垃圾回收时,可以从 GC Roots 运行可达性分析算法进行垃圾标记回收。当运行一段 java 方法时,方法结束或到安全点时,垃圾收集器会以局部变量表作为 GC Roots 出发标记这些对象,如果垃圾对象不可达,则会被垃圾收集器回收。至于局部变量表中的局部变量,因为局部变量表是可复用的,到时候它所占用的槽位置会被其他变量所复用,所以影响不大。

3、结论

平时我们一直说线上有问题时打一个线程栈,就是线程运行时运行哪些方法。为什么能看到方法,应该方法运行需要栈帧进行入栈操作,jvm工具通过分析栈帧,自然就知道当前线程正在运行哪些方法。

相关文章

  • java线程

    [TOC] 4 运行原理 4.1 栈与栈帧 Java Virtual Machine Stacks (Java ...

  • 2021-01-19 线程运行原理

    栈与栈帧 Java Virtual Machine Stacks (Java 虚拟机栈)我们都知道 JVM 中由堆...

  • java 栈帧

    每个线程都维护有自己的栈,每一个方法的执行都代表入栈和出栈,该结构保证了局部变量的线程安全性

  • Java 栈帧

    1、前言 前一篇文章重点说了 Java 代码的类加载机制,说明了 .class 文件是怎么说加载 -> 卸载的,但...

  • JVM整理

    JVM基本结构 Java栈:1.过多的线程或栈帧过多时会造成溢出StackOverflowError。2.Java...

  • JAVA堆栈的区别

    1 JVM栈 (Java Virtual Machine Stacks) 在介绍JVM栈之前,我先了解一下 栈帧 ...

  • Java虚拟机知识点【栈帧】

      栈帧是Java虚拟机栈的结构,每个栈帧都有自己的局部变量表、操作数栈、动态链接和方法返回地址等信息,还允许携带...

  • java虚拟机栈

    # java虚拟机内存模型 # java虚拟机栈 ## 栈帧的基本结构:局部变量表,操作数栈,动态连接方法,返回地...

  • 随谈Java - (二)内存区域

    一、JVM内存区域规范 1.1 各区域作用 Java方法栈:以栈的形式存放栈帧,每一个Java方法调用的开始和结束...

  • java虚拟机内存模型总结

    java虚拟机内存模型 线程私有区:线程私有,随线程创建而创建 虚拟机栈: 栈里面是一个个栈帧,每个栈帧对应一次方...

网友评论

      本文标题:Java 栈帧

      本文链接:https://www.haomeiwen.com/subject/keflkltx.html