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 c;
  }

  public static void main(String[] args) {
    System.out.println(hello());
  }
}

一 生成字节码文件

javac demo1.java

生成之后,扩展名是.class,这个文件对于我们来说是没有可读性的。

二 对class文件反汇编

javap demo1.class > demo1.txt

我们可以通过文件编译工具来查看demo1.txt的内容

Compiled from "Demo1.java"
public class com.lind.basic.Demo1 {
  public com.lind.basic.Demo1();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  static int hello();
    Code:
       0: iconst_1 // 把第一个整型变量推到操作数栈
       1: istore_0 // 让它出栈,并存储到局部变量表
       2: iconst_2
       3: istore_1
       4: iload_0 // 加载第一个数据入操作数栈
       5: iload_1 // 加载第二个数据入操作数栈
       6: iadd // 将两个数相加,结束入操作数栈
       7: istore_2 // 将结果出栈,存到局部变量表
       8: iload_2 // 加载它入操作数栈
       9: ireturn // 返回

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: invokestatic  #3                  // Method hello:()I
       6: invokevirtual #4                  // Method java/io/PrintStream.println:(I)V
       9: return
}

对于上面的汇编文件,我们是可以看的懂的,而且我们需要,汇编语言可以直接在计算机上运行,我想jvm应该也是把class文件生成对应操作系统的汇编文件,然后交给操作系统去执行吧!

原文地址:https://www.cnblogs.com/lori/p/11428932.html

时间: 2024-11-08 18:02:03

jvm虚拟机栈的作用的相关文章

JVM 虚拟机栈

虚拟机栈: 栈元素是栈帧.方法调用,栈帧入栈,反之出栈. 栈帧:一个方法的运行空间. 1.局部变量表:方法定义的局部变量.方法的参数存在该表. 实例方法中有个隐含参数“this”,所以实例方法可以访问该类的实例变量和其他实例方法. 局部变量表中变量的存放顺序:this(如果是实例方法)=>参数(如果有)=> 定义的局部变量(如果有) slot是局部变量表中的空间单元,虚拟机规范规定:1.32位之内的数据,用一个slot来存放,如int.short.float等:2.64位的数据用连续两个slo

深入理解JVM虚拟机(一):JVM运行时数据区

概述: JVM将内存的管理进行封装,使得开发人员不必关心内存申请.释放操作.但是在高级程序开发.复杂业务场景开发的时候,如果出现内存溢出的情况,对于开发人员而言就很难去分析出原因.所以还是很有必要去了解一下JVM是如何进行内存操作的. 基础知识普及 堆(Heap):是一种数据结构,数据存储方式是先进先出(FIFO-first in first out),并且以树结构进行存储,顾名思义只允许首位操作,不允许操作中间数据.堆是计算机为开发人员分配的一个存储空间,由开发人员自由支配,开发人员如果不释放

深入JVM虚拟机(二) JVM运行机制

深入JVM虚拟机(二) JVM运行机制 1 JVM运行机制 1.1 JVM启动流程 JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置. 2.装载JVM.dll. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. J

浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷

2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产生,线程结束而消亡 线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧(Stack Frame),用于存储局部变量表.操作数栈.动态连接.方法返回地址等信息.每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈(压栈)到出栈(弹栈)的过程 每个线程只能有一个活动栈帧,

JVM运行时数据区--java虚拟机栈

虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令. 内存中的堆与栈 栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据.堆解决的是数据存储的问题,即数据怎么放.放在哪儿. 2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块 3.栈空间存放 基本数据类型的局部变量,以及引用数据类型

JVM【第六回】:【OutOfMemoryError异常之虚拟机栈和本地方法栈溢出】

由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是无效的,栈容量只由-Xss参数设定.关于虚拟机栈和本地方法栈,在Java规范中描述了两种异常: 如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 在下面的代码中,如果将范围限制于单线程中的操作,尝试下面两种方法均无法让

Jvm(9),运行时数据---独占区---虚拟机栈

一,总览 Java Virtual Machine Stacks,线程私有,生命周期与线程相同,描述的是Java方法执行的内存模型:每一个方法执行的同时都会创建一个栈帧(Stack Frame),由于存储局部变量表.操作数栈.动态链接.方法出口等信息.每一个方法的执行就对应着栈帧在虚拟机栈中的入栈,出栈过程. 我们来看一个例子 public class Demo3 { public void test1() { System.out.println("我是test1的方法"); tes

JVM 运行时数据区:程序计数器、Java 虚拟机栈和本地方法栈,方法区和堆

Java 虚拟机可以看作一台抽象的计算机,如同真实的计算机,它也有自己的指令集和运行时内存区域. Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存(运行时内存区域)划分为若干个不同的数据区域. 如下图所示: 一.程序计数器 Program Counter Register 定义:程序计数器是当前线程所执行字节码的行号指示器. 原因:Java 中的多线程是线程间轮流切换并需要 CPU 给予时间片的方式实现的.在任何一个确定的时刻,都只有一个线程在执行指令.为了线程间轮流切换后能够快

JVM探秘6--图解虚拟机栈的局部变量表和操作数栈工作流程

案例代码如下: 1 public class JVMTest { 2 public static Integer num = 10; 3 4 public int add(int i){ 5 int j = 5; 6 int k = i+j; 7 j++; 8 k = num + j; 9 return k; 10 } 11 12 public static void main(String[] args){ 13 System.out.println(new JVMTest().add(4))