java虚拟机中栈的运行知识点总结

作者:小妮浅浅 时间:2023-06-21 04:09:58 

运行原理

1、不同线程中所包含的栈帧是不允许存在相互引用的。

2、如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给当前一个栈针,并且虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧。

3、Java方法有两种返回函数的方式,一种是正常的函数返回,使用return指令;另一种是抛出异常。不管使用哪种方式,都会导致栈帧被弹出。

实例


public class StackFrameTest {
   public static void main(String[] args) {
       StackFrameTest stackFrameTest = new StackFrameTest();
       stackFrameTest.method1();
   }

public void method1(){
       System.out.println("method1()开始执行");
       method2();
       System.out.println("method1()执行结束");
   }
   public int method2(){
       System.out.println("method2()开始执行");
       int i = 100;
       int m = (int)method3();
       System.out.println("method2()即将结束");
       return i + m;
   }
   public double method3(){
       System.out.println("method3()开始执行");
       double j = 3.1;
       System.out.println("method3()即将结束");
       return j;
   }
}

知识点扩充:

1. Java栈也称为虚拟机栈,也就是我们常常所说的栈。 Java栈是Java方法执行的内存模型。

2. Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。 当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。 因此对于方法没有存在回收资源一说 。

3. 局部变量表,顾名思义,想必不用解释大家应该明白它的作用了吧。就是用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。

4. 操作数栈,想必学过数据结构中的栈的朋友想必对表达式求值问题不会陌生,栈最典型的一个应用就是用来对表达式求值。想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,程序中的所有计算过程都是在借助于操作数 。

来源:https://www.py.cn/java/jichu/31183.html

标签:java虚拟机,java栈
0
投稿

猜你喜欢

  • java读取文件内容的三种方法代码片断分享(java文件操作)

    2023-11-21 06:53:20
  • Android TV 3D卡片无限循环效果

    2022-03-26 04:06:48
  • Android实现换肤的两种思路分析

    2023-03-25 13:54:18
  • 通过实例学习Either 树和模式匹配

    2023-05-21 02:02:41
  • Android贝塞尔曲线初步学习第二课 仿QQ未读消息气泡拖拽黏连效果

    2023-08-18 10:18:20
  • Android开发笔记之:一分钟学会使用Logcat调试程序的详解

    2022-07-19 05:17:22
  • java 动态增加定时任务示例

    2023-07-29 06:56:00
  • Android Studio设置或修改Android SDK路径方法

    2023-11-07 17:22:10
  • 如何使用JJWT及JWT讲解和工具类

    2023-10-28 04:21:35
  • C++语言io流处理基本操作教程示例

    2023-11-02 22:07:39
  • Android入门之画图详解

    2023-11-09 11:47:47
  • java简单手写版本实现时间轮算法

    2023-01-05 14:50:38
  • mybatis 集合嵌套查询和集合嵌套结果的区别说明

    2022-10-12 15:17:02
  • 图解JVM垃圾内存回收算法

    2023-10-13 17:24:35
  • C#读取配置文件的方法汇总

    2022-09-13 08:55:35
  • 简单实现C#异步操作

    2022-09-05 06:03:00
  • C# CultureInfo类案例详解

    2023-04-20 05:00:45
  • C#直线的最小二乘法线性回归运算实例

    2022-05-03 11:19:33
  • Mybatis中TypeAliasRegistry的作用及使用方法

    2023-06-27 19:21:32
  • C#获取U盘序列号的方法

    2023-09-15 02:09:54
  • asp之家 软件编程 m.aspxhome.com