new指令格式:new indexbyte1,indexbyte2
new指令过程:
要执行new指令,Jvm通过计算(indextype1<<8)|indextype2生成一个指向常量池的无符号16位索引。然后JVM根据计算出的索引查找JVM常量池入口。该索引所指向的常量池入口必须为CONSTANT_Class_info。如果该入口尚不存在,那么 JVM将解析这个常量池入口,该入口类型必须是类。JVM从堆中为新对象映像分配足够大的空间,并将对象的实例变量设为默认值。最后JVM将指向新对象的引用objectref压入操作数栈。
dup指令格式:dup
dup指令过程:
要执行dup指令,JVM复制了操作数栈顶部一个字长的内容,然后再将复制内容压入栈。本指令能够从操作数栈顶部复制任何单位字长的值。但绝对不要使用它来复制操作数栈顶部任何两个字长(long型或double型)中的一个字长。上面例中,即复制引用objectref,这时在操作数栈存在2 个引用。
ldc指令格式:ldc,index
ldc指令过程:
要执行ldc指令,JVM首先查找index所指定的常量池入口,在index指向的JVM常量池入口,JVM将会查找 CONSTANT_Integer_info,CONSTANT_Float_info和CONSTANT_String_info入口。如果还没有这些入口,JVM会解析它们。而对于上面的haha,JVM会找到CONSTANT_String_info入口,同时,将把指向被拘留String对象(由解析该入口的进程产生)的引用压入操作数栈。
invokespecial指令格式:invokespecial,indextype1,indextype2
invokespecial指令过程:对于该类而言,该指令是用来进行实例初始化方法的调用。上面例子中,即通过其中一个引用调用String类的构造器,初始化对象实例,让另一个相同的引用指向这个被初始化的对象实例,然后前一个引用弹出操作数栈。
astore_1指令格式:astore_1
astore_1指令过程:
要执行astore_1指令,JVM从操作数栈顶部弹出一个引用类型或者returnAddress类型值,然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnAddress类型值存入局部变量1。
return 指令的过程:
从方法中返回,返回值为void,要执行astore_1指令,JVM从操作数栈顶部弹出一个引用类型或者returnAddress类型值,然后将该值存入由索引1指定的局部变量中,即将引用类型或者returnAddress类型值存入局部变量1。
通过上面6个指令,可以看出,String s = new String("haha");中的haha存储在堆空间中,而s则是在操作数栈中。上面是对s和haha值的内存情况的分析和理解;那对于String s = new String("haha");语句,到底创建了几个对象呢?这里"haha"本身就是JVM常量池中的一个对象,而在运行时执行new String()时,将JVM常量池中的对象复制一份放到堆中,并且把堆中的这个对象的引用交给s持有。所以这条语句就创建了2个String对象。下面是一些String相关的常见问题:
String中的final用法和理解
final StringBuffer a = new StringBuffer("111"); final StringBuffer b = new StringBuffer("222"); a=b;//此句编译不通过 final StringBuffer a = new StringBuffer("111"); a.append("222");//编译通过
可见,final只对引用的"值"(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。
String 常量池问题的几个例子
下面是几个常见例子的比较分析和理解:
final StringBuffer a = new StringBuffer("111"); final StringBuffer b = new StringBuffer("222"); a=b;//此句编译不通过 final StringBuffer a = new StringBuffer("111"); a.append("222");//编译通过 |
分享到:
相关推荐
JVM指令集是JVM的核心组成部分,它定义了JVM能够理解和执行的一系列低级操作指令。这些指令构成了Java程序在运行时的微观世界,对理解JVM的工作原理至关重要。下面我们将深入探讨JVM指令集及其重要性。 1. **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. **操作...