Java虚拟机工作原理(JVM)

合集下载

jvm的gc原理

jvm的gc原理

jvm的gc原理JVM的GC原理一、概述JVM(Java虚拟机)是Java程序运行的环境,其中最重要的组成部分之一就是垃圾回收(Garbage Collection,简称GC)机制。

GC的作用是自动管理程序中的内存,及时释放不再使用的对象,以避免内存泄漏和内存溢出的问题。

本文将对JVM的GC原理进行详细介绍。

二、垃圾回收算法1. 标记-清除算法标记-清除算法是最基本的垃圾回收算法之一。

它的过程分为两个阶段:标记阶段和清除阶段。

在标记阶段,GC会从根节点(一般是程序中的静态变量和栈中的引用)开始,递归地遍历对象图,标记出所有被引用的对象。

在清除阶段,GC会遍历整个堆,清除所有未被标记的对象。

2. 复制算法复制算法是针对标记-清除算法的改进。

它将堆分为两个区域,每次只使用其中一个区域。

当一个区域的对象被标记后,将其复制到另一个区域中,然后清除原来的区域。

这样可以解决碎片问题,但是需要额外的空间来存储复制的对象。

3. 标记-整理算法标记-整理算法是对标记-清除算法的改进。

它的过程与标记-清除算法类似,但是在清除阶段,标记-整理算法会将存活的对象向一端移动,然后清除边界外的所有对象。

这样可以解决碎片问题,并且不需要额外的空间。

4. 分代算法分代算法是针对对象的生命周期不同而提出的。

一般来说,对象的生命周期可以分为年轻代和老年代。

年轻代中的对象生命周期较短,老年代中的对象生命周期较长。

分代算法将堆分为年轻代和老年代两个区域,分别采用不同的垃圾回收算法。

年轻代一般使用复制算法,老年代一般使用标记-清除算法或标记-整理算法。

三、GC的执行过程1. 初始标记初始标记阶段是GC的第一步,它的目的是标记出所有的根对象,并且停止所有的应用线程。

这个过程是短暂的,因为只需要标记出与根对象直接关联的对象。

2. 并发标记并发标记阶段是GC的核心步骤,它的目的是通过并发执行来标记出所有的存活对象。

在这个阶段,GC会遍历整个堆,标记出与根对象直接或间接关联的存活对象。

JVM工作原理

JVM工作原理

JVM工作原理JVM(Java虚拟机)是Java程序的运行环境,它负责将Java源代码编译成可执行的字节码,并提供运行时环境来执行字节码。

JVM的工作原理涉及到类加载、内存管理、垃圾回收、即时编译等多个方面。

1. 类加载JVM通过类加载器(ClassLoader)来加载Java类。

类加载器根据类的全限定名(包括包名和类名)在类路径中查找对应的字节码文件,并将其加载到内存中。

类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器尝试加载。

这种模型保证了类的唯一性和安全性。

2. 内存管理JVM将内存分为多个区域,包括方法区、堆、栈和程序计数器。

方法区存储类的元数据信息,如字段、方法、常量池等。

堆是存放对象实例的区域,通过垃圾回收机制来管理内存的分配和释放。

栈用于存储方法的局部变量和方法调用信息。

程序计数器用于指示当前线程执行的字节码指令。

3. 垃圾回收JVM通过垃圾回收机制自动回收不再使用的对象内存。

垃圾回收器会定期扫描堆内存,标记所有还在使用的对象,然后清理掉未被标记的对象。

常见的垃圾回收算法有标记-清除、复制、标记-整理等。

JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS、G1等,可以根据应用场景选择合适的垃圾回收器。

4. 即时编译JVM使用即时编译器(Just-In-Time Compiler)将热点代码(经常被执行的代码)编译成本地机器码,以提高执行效率。

JVM会监测程序的运行情况,根据热点代码的执行频率和调用关系进行优化编译。

即时编译器可以选择不同的编译策略,如解释执行、编译执行或混合执行。

5. 内存模型JVM定义了Java程序在多线程环境下的内存模型,保证多线程的内存可见性和有序性。

内存模型规定了线程之间如何进行通信和同步。

JVM使用主内存和工作内存的概念,线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对共享变量的操作先在工作内存中进行,然后通过主内存来同步和通信。

面试谈jvm原理

面试谈jvm原理

面试谈jvm原理Java虚拟机(JVM)是Java语言运行的基础。

JVM具有封装性、跨平台性、高度优化和可扩展性等特点,是Java应用程序的核心。

在Java的诞生初期,由于硬件环境和操作系统制约,JVM起到了垫底的作用。

而今天,JVM已经成为Java 运行效率和安全性的保障。

下面是一些我认为JVM原理面试时可能会涉及的重点:1. JVM的内存模型:JVM将内存分为堆内存和栈内存,堆内存用于存储对象实例和数组,而栈内存则用于存储方法的执行状态。

同时,JVM还有方法区和永久代的概念。

这些内存区域的大小和分配情况会影响JVM的性能和稳定性。

2. 垃圾回收机制:JVM的内存管理包括垃圾回收机制和内存分配机制。

垃圾回收机制是JVM实现自动内存管理的核心,JVM会周期性地扫描堆内存中没有被引用的对象,并自动回收它们所占用的内存。

垃圾回收机制常用的算法包括标记清除、复制和标记整理等。

3. 类加载机制:Java程序在运行时,需要将类文件中的二进制数据加载到JVM 中,才能执行相应的操作。

类加载机制将类文件加载到JVM中,并将它们解析为Java类。

类加载机制包括三个阶段:加载、链接和初始化。

4. JIT编译器:JIT(Just In Time)编译器是JVM在运行时动态优化的关键组件。

JIT编译器可以在程序运行时,根据代码的执行情况,生成本地机器代码,以提高程序的效率。

5. JVM调优:JVM的性能和稳定性很大程度上取决于JVM参数的设置和调整。

面试时,可能会涉及到如何根据系统的特点和需求,设置JVM参数以达到最佳性能和稳定性的问题。

总之,有关JVM原理的面试问题,往往涉及到JVM的内存模型、垃圾回收机制、类加载机制、JIT编译器和JVM调优等方面。

需要候选人对这些方面有比较深入的了解。

java虚拟机的工作原理

java虚拟机的工作原理

java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。

JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。

1.类加载:JVM通过类加载器将Java字节码加载到内存中。

类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。

加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。

2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。

JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。

垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。

垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。

除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。

堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。

JVM的工作过程如下:1. 通过类加载器加载Java字节码。

2.解释执行或JIT编译字节码。

3.根据需要进行垃圾回收和内存管理。

4.执行程序。

JVM的优点是跨平台性、自动内存管理和高性能。

通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。

JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。

JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。

在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。

开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。

同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。

jvm原理

jvm原理

JVM 原理解释JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。

我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的元素,运算器是当然是交给硬件 CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。

JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中。

JVM 的组成部分Class Loader 类加载器类加载器的作用是加载类文件(.class)到内存,Class Loader 加载的 class 文件是有格式要求的。

类加载的最终产品是位于运行时数据区的堆区的Class对象。

Class对象封装了类在方法区内部的数据结构。

并且向JAVA程序提供了访问类在方法区内的数据结构。

JVM加载class文件的原理机制1. Java 中的所有类,必须被装载到 JMV 中才能运行,这个装载工作是由 JVM 中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。

2. Java中的类大致分为三种:a) 系统类b) 扩展类c) 由程序员自定义的类3. 类装载方式,有两种:a) 隐式装载,程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。

b) 显式装载,通过 class.forname() 等方法,显式加载需要的类。

4. 类加载的动态性体现一个应用程序总是由n多个类组成,Java 程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到 JVM 中,其它类等到 JVM 用到的时候再加载,这样的好处是节省了内存的开销。

jvm底层原理

jvm底层原理

jvm底层原理Java虚拟机(JVM)是一个虚拟环境,用于运行Java字节码和管理应用程序的内存。

它是Java程序模型和程序语言的基础,可以让Java程序在跨平台的操作系统中被执行和运行。

JVM的底层原理是什么呢?本文将探索JVM的底层原理以及它是如何实现跨平台运行的。

JVM的底层原理就是:将Java程序编译为字节码,然后由JVM 负责执行这些字节码,并负责管理Java程序的内存。

JVM由几部分组成:类加载器、解释器、调用处理器和运行时数据区。

首先,类加载器会加载Java源程序,将其编译为字节码,字节码会被加载到解释器中。

解释器定义了基本的Java语言规则,然后会解释、执行字节码,并将执行结果反馈给调用处理器。

调用处理器会对不同方法调用做出不同反应,这些方法调用包括内部类方法调用、虚拟方法调用等。

接下来,运行时数据区会存储程序的各种变量和对象,并且管理内存。

最后,JVM会利用垃圾回收机制来管理内存,确保程序不出现内存泄漏问题。

因此,JVM的底层原理是:将程序编译为字节码,由解释器解释执行,由调用处理器控制方法调用,由运行时数据区管理内存,然后由垃圾回收机制管理内存,最后实现跨平台的运行。

JVM的底层原理极大地改善和简化了Java程序的运行,使得Java 程序能够在不同平台上运行。

JVM的底层原理不仅提高了Java程序的执行效率,而且提供了安全的程序运行环境,确保了Java程序的稳定性。

总之,JVM的底层原理是一个重要的技术,使得Java程序能够跨平台地运行,提高了程序执行效率,提供了一个安全的运行环境。

研究JVM的底层原理,一定会帮助Java程序员实现更高效和安全的程序编写。

JVM运行机制及其原理

JVM运行机制及其原理

JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。

它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。

JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。

1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。

类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。

- 验证:确保加载的类符合Java语言规范和JVM规范。

-准备:为类的静态变量分配内存并初始化为默认值。

-解析:将符号引用转换为直接引用。

-初始化:执行类的初始化方法。

2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。

这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。

3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。

在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。

JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。

5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。

JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。

类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。

6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。

程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。

jvm的工作原理

jvm的工作原理

jvm的工作原理
JVM(Java虚拟机)是一种运行Java字节码的虚拟机,它是Java 语言的核心组成部分。

JVM的主要工作是将Java代码编译成字节码并在运行时执行这些字节码。

JVM的工作流程如下:
1. 读取字节码:JVM读取字节码文件并将其加载到内存中。

2. 类加载:JVM将字节码文件转换为Java类,并进行类的验证、准备和解析。

3. 内存分配:JVM为Java类分配内存空间,并将其属性和方法加载到内存中。

4. 字节码执行:JVM执行Java字节码,通过解释器或即时编译器将字节码转换为机器码,并在CPU上运行。

5. 垃圾回收:JVM负责管理Java对象的内存分配和释放,使用垃圾回收算法来自动回收不再使用的对象。

JVM的工作原理是基于Java语言的跨平台特性,它将Java代码转换为字节码,使得Java程序可以在不同的操作系统和硬件上运行。

同时,JVM的垃圾回收机制可以有效地管理内存,避免了内存泄漏和越界访问等问题,提高了Java程序的稳定性和安全性。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

As the Java Virtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions.Java虚拟机是基于栈的(stack-based machine)。

几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。

1Java体系结构介绍Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems:1.1 Java体系结构包括哪几部分?Java体系结构包括4个独立但相关的技术the Java programming language →程序设计语言the Java class file format →字节码文件格式the Java Application Programming Interface→应用编程接口the Java Virtual Machine →虚拟机1.2 什么是JVMjava虚拟机和java API组成了java运行时。

1.3 JVM的主要任务。

Java虚拟机的主要任务是装载class文件并执行其中的字节码。

Java虚拟机包含了一个类装载器。

类装载器的体系结构二种类装载器启动类装载器用户定义的类装载器启动类装载器是JVM实现的一部分当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。

1.4 为什么java容易被反编译?●因为java程序是动态连接的。

从一个类到另一个类的引用是符号化的。

在静态连接的可执行程序中。

类之间的引用只是直接的指针或者偏移量。

相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。

●如果引用是指向一个字段的话。

这个字段的名字和描述符(字段的类型)会被详细说明。

●如果引用指向一个成员方法,那么这个成员方法的名字和描述符(方法的返回值类型,方法参数的数量和类型)会被详细说明。

●包含对自己字段和成员方法的符号引用。

●包含可选的调试信息。

(包括局部变量的名称和类型)1.5 垃圾回收器缺点:无法确认什么时候开始回收垃圾,无法确认是否已经开始收集,也无法确认要持续多长时间2平台无关3安全4网络移动性5Java虚拟机●每个JVM都有一个类装载子系统。

●运行时数据区:方法区,堆,java栈,pc寄存器,本地方法栈●每个JVM实例都有一个方法区和堆。

他们是由该虚拟机中所有线程共享的。

●每个线程都会得到自己的pc寄存器和java栈,⏹pc寄存器的值指示下一条将被执行的指令。

⏹java栈记录存储该线程中java方法调用的状态。

(包括局部变量,参数,返回值,运算的中间结果。

)⏹这些内存区域是私有的。

任何线程都不能访问另一个线程的pc寄存器和java栈●java栈由许多栈帧组成。

一个栈帧包含一个java方法的调用的状态。

⏹当线程调用一个方法的时候,虚拟机压入一个新的栈桢到该线程的java栈中。

⏹当方法返回时,这个栈桢被从java栈中弹出并抛弃。

●引用有3中,类类型,接口类型,数组类型。

●JVM中,最基本的数据单元是字。

至少选择32位作为字长。

●JVM有两种类装载器:⏹启动类装载器(JVM实现的一部分,每个JVM都必须有一个)⏹用户自定义的类装载器(JA V A程序的一部分,必须继承ng.CloassLoader)。

●由不同的类装载器装载的类被放在虚拟机内部的不同的命名空间中。

●方法区:⏹大小不固定,根据需要动态调整⏹方法区可以被垃圾回收⏹包含◆提取装载的类的信息,放到方法区●JVM总能通过存储于方法区的内存信息来确定一个对象需要多少内存◆类的静态变量也放到方法区。

⏹虚拟机为装载的每个类存储如下信息:◆这个类型的全限定名◆这个类型的直接超类的全限定名◆这个类型是类类型还是接口类型◆这个类的访问权限修饰符◆任何直接超接口的全限定名的有序列表◆该类型的常量池●该类型所用常量的一个有序集合,包括直接常量(String,Integer,floatingpoint),和对其他类型,字段,方法的符号引用◆字段信息●字段名●字段类型●字段的修饰符●声明的顺序◆方法信息●方法名●方法的返回值类型●方法的参数和类型,顺序●方法的修饰符●方法的操作码●操作数栈和该方法的栈帧中局部变量区的大小●异常表◆除了常量以外的所有类(静态)变量◆一个到类CloassLoader的引用◆一个到Class类的引用◆方法表●虚拟机为每一个装载的非抽象类都生成一个方法表⏹堆◆◆一个java程序独占一个JVM,一个JVM中只存在一个堆。

所以,每个java程序有它自己的堆,但同一个java程序的多个线程共享一个堆◆运行时创建的所有类实例◆数组对象⏹垃圾回收器◆回收内存◆移动对象以减少碎片◆不必是连续的内存,可以动态的扩展和收缩◆一个JVM的实现的方法区可以在堆顶实现⏹栈帧◆栈帧由3部分组成:局部变量区,操作数栈,帧数据区。

◆局部变量区,操作数栈的大小在编译的时候就确定了。

◆局部变量区●以字长为单位,从0开始计数的数组。

●int,float,reference,return address只占据一个字长●byte,short,char存入数组前转换成int,占据一个字长●long,double占据2个字长。

●包含对应方法的参数和局部变量,●方法的局部变量任意决定顺序,甚至一个索引指代两个变量,(当2个变量的作用域不重复时)◆操作数栈●以字长为单位的数组,但不是通过索引来访问,而是通过标准的栈操作●存贮数据的方式和局部变量区一样。

◆帧数据区●帧数据区保存常量池解析,正常方法返回,异常派发机制等信息◆执行引擎◆线程:●JVM只规定了最高级别的线程会得到大多数的CPU时间,●较低优先级别的线程,只有在所有比它优先级更高的线程全部阻塞的情况下才能保证得到CPU时间。

●级别低的线程在级别高的线程没有被阻塞的时候,也可能得到CPU时间,但是这没有任何保证。

●每个虚拟机都有一个主存,用于保存所有的程序变量(对象的实例变量,数组的元素,以及类变量)。

每一个线程都有一个工作内存,线程用它保存所使用和赋值的“工作拷贝”。

●局部变量和参数,因为他们是每个线程私有的,可以逻辑上看成是工作内存或者主存的一部分。

6字节码文件8位字节的二进制流常量池标志每一个标志都有一个相对应的表。

表名通过在标志后面加上"_info"后缀来产生7类型的声明周期●装载⏹通过该类型的完全限定名,产生一个该类型的二进制数据流⏹解析这个二进制数据流为方法区内的内部数据结构⏹(并在堆上)创建一个表示该类型的ng.Class类的实例●连接(已读入的二进制形式的类型数据合并到虚拟机的运行时状态中去)⏹验证(保证java类型数据格式正确并适合JVM使用)⏹准备(分配内存,默认初始化在此时发生)⏹解析(把常量池中的符号引用(类,接口,字段,方法)转换为直接引用,虚拟机的实现可以推迟解析这一步,它可以在当运行中的程序真正使用某个符号引用是再去解析它)●初始化(将类变量赋予适当的初始值(显式初始化),所有JVM的实现必须在每个类或接口首次主动使用是被初始化)对象的生命周期●类实例化有四种途径:⏹new⏹调用Class或者ng.reflect.Constructor的newInstance ( )⏹clone ( )⏹java.io.ObjectInputStream的getObject ( )8连接模型●动态连接和解析●常量池:⏹class文件把它所有的引用符号保存在一个地方,常量池⏹每个文件有一个常量池⏹每一个被JVM装载的类或者接口都有一份内部版本的常量池,被称作运行时常量池⏹运行时常量池映射到class文件的常量池⏹JVM为每一个装载的类和接口保存一份独立的常量池。

⏹来自相同方法或不同方法中的几条指令,可能指向同一个常量池入口。

⏹每个常量池入口只被解析一次。

●解析⏹在程序运行的某些时刻,如果某个特定的符号引用将要被使用,它首先要被解析。

⏹解析过程就是根据符号引用查找到实体,在把符号引用替换成直接引用的过程。

⏹所有的符号引用都保持在常量池,所以这个过程也被称作常量池解析。

⏹解析分为早解析和迟解析。

9垃圾收集10栈和局部变量操作Stack and Local Variable Operations10.1 常量入栈操作Pushing Constants Onto the Stack10.1.1将一个字长的常量压入栈10.1.2将一个字长的常量压入栈long and double values occupy 64 bits. Each time a long or double is pushed onto the stack, its value occupies two slots on the stack.long和double类型的值是64位长度的值,每当一个long或者double类型的值被压入栈,将占据2个位置10.1.3将空的对象引用(null)压入栈One other opcode pushes an implicit constant value onto the stack. The aconst_null opcode, pushes a null object reference onto the stack.Opcode Operand(s) Descriptionaconst_null (none) pushes a null object reference onto the stack10.1.4将byte和short类型常量压入栈10.1.5将常量池入口压入栈Pushing constant pool entries onto the stackOpcode Operand(s) Descriptionldc indexbyte1 pushes single-word value from constant pool entryspecified by indexbyte1 onto the stackldc_w indexbyte1,indexbyte2 pushes single-word value from constant pool entry specified by indexbyte1, indexbyte2 onto the stackldc2_w indexbyte1,indexbyte2 pushes dual-word value from constant pool entry specified by indexbyte1, indexbyte2 onto the stack10.2 通用栈操作Generic Stack Operations10.2.1栈操作Stack manipulationOpcode Operand(s) Descriptionnop (none) do nothingpop (none) pop the top word from the operand stackpop2 (none) pop the top two words from the operand stackswap (none) swap the top operand stack two wordsdup (none) duplicate top operand stack worddup2 (none) duplicate top two operand stack wordsdup_x1 (none) duplicate top operand stack word and put two downdup_x2 (none) duplicate top operand stack word and put three downdup2_x1 (none) duplicate top two operand stack words and put three down dup2_x2 (none) duplicate top two operand stack words and put four down10.3 把局部变量压入栈Pushing Local Variables Onto the Stack10.3.1将1个字长的局部变量压入栈Pushing single-word local variables onto the stackOpcode Operand(s) Descriptioniload vindex pushes int from local variable position vindexiload_0 (none) pushes int from local variable position zeroiload_1 (none) pushes int from local variable position oneiload_2 (none) pushes int from local variable position twoiload_3 (none) pushes int from local variable position threefload vindex pushes float from local variable position vindexfload_0 (none) pushes float from local variable position zerofload_1 (none) pushes float from local variable position onefload_2 (none) pushes float from local variable position twofload_3 (none) pushes float from local variable position three10.3.2将2个字长的局部变量压入栈Pushing dual-word local variables onto the stackOpcode Operand(s) Descriptionlload vindex pushes long from local variable positions vindex and (vindex+ 1)lload_0 (none) pushes long from local variable positions zero and onelload_1 (none) pushes long from local variable positions one and twolload_2 (none) pushes long from local variable positions two and threelload_3 (none) pushes long from local variable positions three and four dload vindex pushes double from local variable positions vindex and(vindex + 1)dload_0 (none) pushes double from local variable positions zero and one dload_1 (none) pushes double from local variable positions one and twodload_2 (none) pushes double from local variable positions two and three dload_3 (none) pushes double from local variable positions three and four10.3.3将对象引用局部变量压入栈Table 10-9. Pushing object reference local variables onto the stackOpcode Operand(s) Descriptionaload vindex pushes object reference from local variable position vindex aload_0 (none) pushes object reference from local variable position zero aload_1 (none) pushes object reference from local variable position one aload_2 (none) pushes object reference from local variable position two aload_3 (none) pushes object reference from local variable position three10.4 弹出栈顶部元素,将其赋给局部变量Popping to Local Variables10.4.1弹出一个字长的值,将其赋给局部变量Popping single-word values into local variablesOpcode Operand(s) Descriptionistore vindex pops int to local variable position vindexistore_0 (none) pops int to local variable position zeroistore_1 (none) pops int to local variable position oneistore_2 (none) pops int to local variable position twoistore_3 (none) pops int to local variable position threefstore vindex pops float to local variable position vindexfstore_0 (none) pops float to local variable position zerofstore_1 (none) pops float to local variable position onefstore_2 (none) pops float to local variable position twofstore_3 (none) pops float to local variable position three10.4.2弹出2个字长的值,将其赋给局部变量Popping dual-word values into local variablesOpcode Operand(s) Descriptionlstore vindex pops long to local variable positions vindex and (vindex + 1) lstore_0 (none) pops long to local variable positions zero and onelstore_1 (none) pops long to local variable positions one and twolstore_2 (none) pops long to local variable positions two and threelstore_3 (none) pops long to local variable positions three and fourdstore vindex pops double to local variable positions vindex and (vindex +1)dstore_0 (none) pops double to local variable positions zero and onedstore_1 (none) pops double to local variable positions one and twodstore_2 (none) pops double to local variable positions two and threedstore_3 (none) pops double to local variable positions three and four10.4.3弹出对象引用,将其赋给局部变量Popping object references into local variablesOpcode Operand(s) Descriptionastore vindex pops object reference to local variable position vindexastore_0 (none) pops object reference to local variable position zeroastore_1 (none) pops object reference to local variable position oneastore_2 (none) pops object reference to local variable position twoastore_3 (none) pops object reference to local variable position three10.5 wide指令The wide Instruction10.5.1弹出对象引用,将其赋给局部变量Popping object references into local variables无符号8位局部变量索引,把方法中的局部变量限制在256以下。

相关文档
最新文档