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工具通过分析栈帧,自然就知道当前线程正在运行哪些方法。
网友评论