ldc指令格式:
ldc,index
ldc指令过程:要执行ldc指令,JVM首先查找index所指定的常量池入口,在index指向的JVM常量池入口,JVM将会查找 CONSTANT_Integer_info,CONSTANT_Float_info和CONSTANT_String_info入口。如果还没有这些入口,JVM会解析它们。而对于上面的hahaJVM会找到CONSTANT_String_info入口,同时,将把指向被拘留String对象(由解析该入口的进程产生)的引用压入操作数栈。
astore_1指令格式:
astore_1
astore_1指令过程:要执行astore_1指令,JVM从操作数栈顶部弹出一个引用类型或者returnAddress类型值,然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnAddress类型值存入局部变量1。
return 指令的过程:
从上面的ldc指令的执行过程可以得出:s的值是来自被拘留String对象(由解析该入口的进程产生)的引用,即可以理解为是从被拘留 String对象的引用复制而来的,故我个人的理解是s的值是存在栈当中。上面是对于s值得分析,接着是对于"haha"值的分析,我们知道,对于 String s = "haha" 其中"haha"值在JAVA程序编译期就确定下来了的。简单一点说,就是haha的值在程序编译成class文件后,就在class文件中生成了(大家可以用UE编辑器或其它文本编辑工具在打开class文件后的字节码文件中看到这个haha值)。执行JAVA程序的过程中,第一步是class文件生成,然后被JVM装载到内存执行。那么JVM装载这个class到内存中,其中的haha这个值,在内存中是怎么为其开辟空间并存储在哪个区域中呢?
JVM常量池
虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM常量池在内存当中是以表的形式存在的,对于 String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对JVM常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在介绍完JVM常量池的概念后,接着谈开始提到的"haha"的值的内存分布的位置。对于haha的值,实际上是在class文件被JVM装载到内存当中并被引擎在解析ldc指令并执行ldc指令之前,JVM就已经为haha这个字符串在常量池的CONSTANT_String_info表中分配了空间来存储haha这个值。
既然haha这个字符串常量存储在常量池中,常量池是属于类型信息的一部分,类型信息也就是每一个被转载的类型,这个类型反映到JVM内存模型中是对应存在于JVM内存模型的方法区中,也就是这个类型信息中的JVM常量池概念是存在于在方法区中,而方法区是在JVM内存模型中的堆中由JVM来分配的。所以,haha的值是应该是存在堆空间中的。而对于String s = new String("haha") ,它的JVM指令:
0: new "16; //class String 3: dup 4: ldc "18; //String haha 6: invokespecial "20; //Method java/lang/String."":(Ljava/lang/String;)V 9: astore_1 10: return |
分享到:
相关推荐
1. **JVM指令集概述** JVM指令集是一组二进制指令,每条指令都对应一个特定的操作,如加载、存储、算术运算、控制流等。这些指令由编译器在将源代码编译为字节码时生成。由于JVM是平台无关的,因此指令集设计为与...
本篇将深入探讨JVM指令集,帮助你更好地理解Java程序的内部工作原理。 JVM指令集,也称为字节码指令集,是一系列二进制编码的指令,每个指令都对应一个特定的操作。这些指令在Java源代码被编译成.class文件时生成,...
JVM指令集是JVM的核心组成部分,用于定义和执行Java字节码。每条指令都是一个字节长度的操作码(opcode),后面跟着零个或多个操作数(operand),用于对JVM栈上的数据进行操作。 助记符是一种为指令提供的易于记忆...
以下是对JVM指令集的一些关键点的详细说明: 1. **常量压入栈的指令**:这些指令用于将基本类型的常量或null压入操作栈。例如,`iconst_1`将int类型的值1压入栈,`lconst_0`将long类型的值0压入栈,`aconst_null`则...
### JVM指令集详解 #### 常量加载指令 在JVM执行代码的过程中,经常会遇到需要将特定的常量加载到操作数栈的情况。这部分内容主要介绍了如何将各种类型的常量值加载到栈中。 - **`aconst_null`**:此指令用于将`...
### JVM指令集详解 #### 一、aaload:数组元素加载指令 **操作说明:** `aaload` 是一个用于从引用类型数组中加载元素到操作数栈顶的操作。 **格式:** ``` aaload ``` **指令形式:** ``` aaload = 50 (0x32) `...
JVM指令集的设计是高度优化的,允许在不同平台上的高效运行。 在JVM指令集中,有一些关键的指令类别,包括: 1. **常量压入栈的指令**: - `aconst_null`:将null引用压入栈。 - `iconst_m1`至`iconst_5`:将int...
1. JVM指令类型:JVM指令可以分为不同类型,包括将常量推送到操作数栈的指令(const系列指令),以及用于将单个数值(如int、long、float、double)推送到操作数栈的指令(iconst系列、lconst系列、fconst系列、d...
JVM指令集是JVM内部的工作语言,由一系列单字节的指令组成,每条指令都有特定的功能。这份“JVM指令查询手册”很可能包含了JVM的所有公共指令、它们的含义以及使用方式。下面,我们将深入探讨JVM指令集及其在Java...
JVM指令集是JVM内部使用的微指令集合,这些指令构成了Java字节码的基础。在《JVM指令手册》中,主要涵盖了栈和局部变量的操作,这是理解JVM工作原理的关键部分。 1. 栈和局部变量操作: JVM使用栈来存储临时计算...
为了更好地理解Java程序在JVM中的执行流程,了解JVM指令集至关重要。本文档将详细介绍《JVM指令手册》中关于栈和局部变量操作的部分,涵盖常量压栈以及从栈中加载和存储值的相关指令。 #### 二、常量压栈指令 这...
深入理解Java代码执行过程--JVM 指令集
根据手册中的内容,Java虚拟机指令集主要由加载和存储指令、算术指令、类型转换指令、对象创建和操作指令、操作数栈管理指令、控制转移指令、方法调用和返回指令、异常抛出指令等组成。通过这些指令的组合使用,可以...
JVM指令集是其内部工作原理的基础,每条指令都有特定的功能,用于构建和执行Java应用程序。下面我们将深入探讨JVM指令手册中的关键概念和知识点。 1. **字节码**:Java源代码编译后生成的是字节码文件(.class),...
JVM(Java虚拟机)是执行Java字节码的虚拟机,其指令集是Java程序运行的基石。JVM指令手册是开发者理解和运用JVM指令的重要资料,其中详细介绍了各个指令的作用、参数以及应用场景。中文版JVM指令手册为那些英语阅读...
JVM指令集分为五大类:整数运算指令、浮点运算指令、对象处理指令、控制转移指令和本地变量操作指令。每条指令都有其特定的功能,它们共同构成了Java程序在JVM上运行的基石。 1. **整数运算指令**:这类指令主要...
JVM(Java Virtual Machine)指令集是Java程序执行的基础,它是Java字节码的底层实现。JVM指令是由一系列的16进制码组成的,每种指令都有对应的助记符,用于实现特定的操作。深入理解JVM指令对于优化Java代码性能、...
JVM指令集是JVM执行程序的基础,它包括了数十种不同的指令,这些指令涵盖了从基本的数据操作、控制流管理到对象创建和方法调用等各个方面。例如: 1. **数据操作指令**:如`iconst`系列用于加载常量整数值,`iload`...
下面将详细介绍JVM指令集及其相关知识点。 1. **JVM字节码**:Java源代码被编译成字节码,这是一种中间语言,由单个字节表示的指令组成。这些指令是平台无关的,可以在任何实现了JVM的平台上解释执行。 2. **操作...