总结:JVM对于直接引用和符号引用的处理是有区别的,可以看到符号引用时,JVM将使用StringBuilder来完成字符串的 添加,而直接引用时则直接使用String来完成;直接引用永远比符号引用效率更快,但实际应用开发中不可能全用直接引用,要提高效能可以考虑按虚拟机的思维来编写你的程序。
1.0 直接引用:
public class StringAndStringBuilder{
public static void main(String[] args){
System.out.println ("s=" + "asdfa");
}
}
反编译后的:
F:\java\res\字节码>javap -c StringAndStringBuilder
Compiled from "StringAndStringBuilder.java"
public class StringAndStringBuilder extends java.lang.Object{
public StringAndStringBuilder();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String asdfa
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: ldc #4; //String s=asdfa
8: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
11: return
}
2.0 符号引用:
public class StringAndStringBuilder{
public static void main(String[] args){
String s="asdfa";
System.out.println ("s=" + s);
}
}
反编译后的:
F:\java\res\字节码>javap -c StringAndStringBuilder
Compiled from "StringAndStringBuilder.java"
public class StringAndStringBuilder extends java.lang.Object{
public StringAndStringBuilder();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String asdfa
2: astore_1
3: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
6: new #4; //class java/lang/StringBuilder
9: dup
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V
13: ldc #6; //String s=
15: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
18: aload_1
19: invokevirtual #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
22: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
25: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
28: return
}
分享到:
相关推荐
这有助于更深入地理解JVM如何处理不同类型的对象引用和方法分派。 综上所述,Java虚拟机指令集是Java程序执行的关键组成部分。通过深入研究JVM的工作原理和指令集,可以帮助我们更好地理解和优化Java程序的性能。
4. **解析**:将符号引用转换为直接引用。 5. **初始化**:为类的静态变量赋初始值。 **2.2 加载.class文件的方式** 加载`.class`文件的方式多样,常见的有: 1. **从本地系统直接加载**:最常见的加载方式,从...
4. **解析**:将符号引用转换为直接引用。 5. **初始化**:执行类的初始化方法(),初始化静态变量和执行静态块。 ### 运行时数据区 1. **方法区**:存储类信息、常量、静态变量等。 2. **堆**:所有对象实例都在...
4. 解析:将符号引用转换为直接引用,以便于后续的访问。 5. 初始化:执行类的初始化方法,如静态块。 6. 执行:解释或编译字节码为机器码,然后在CPU上运行。 JVM的启动过程涉及查找JRE路径,通常是通过JDK中的...
4. **解析**:将符号引用转换为直接引用,以便后续直接访问。 5. **初始化**:执行类的静态初始化块。 五、运行结果文档 该项目提供的运行结果文档可能包含了模拟JVM运行示例程序后得到的各种状态信息,如内存使用...
- **解析**:将符号引用转换为直接引用,以便在运行时定位类和方法。 - **初始化**:执行类的静态初始化代码块。 - **执行**:JVM解释器将字节码转化为机器码执行,现代JVM通过即时编译(JIT)技术进一步提高性能...
- 符号表包含了类中的字段符号引用和方法符号引用。 12. **Interned字符串(Interned String)** - Interned字符串指的是通过`String.intern()`方法得到的字符串,这些字符串被存储在一个特殊的池中,以节省内存。...
4. **解析**: 将符号引用转换为直接引用。 5. **初始化**: 执行类构造器`<clinit>`方法,对静态变量赋初始值。 类加载器不仅处理了类的加载,还管理着类之间的依赖关系。例如,当一个类引用了另一个类时,类加载器...
4. **解析**:将符号引用转换为直接引用,为方法调用和字段访问做准备。 5. **初始化**:执行类的初始化方法(),包括静态变量的显示初始化和静态块的执行。 四、垃圾收集 JVM的垃圾收集是自动管理内存的过程,...
加载是找到并读取类文件,验证确保字节码的安全性,准备分配类变量内存并设置初始值,解析将符号引用转为直接引用,初始化执行类初始化方法。 在执行字节码时,JVM采用解释器和即时编译器(JIT)的混合模式。解释器...
JVM规范详细定义了Java可执行代码(即字节码)的格式,包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象和常量缓冲池在JVM中的存储映像。 这些定义为JVM解释器的开发人员提供了...
4. **解析**:将符号引用转换为直接引用。 5. **执行**:解释执行字节码,或者通过即时编译器(JIT)将热点代码编译成本地机器码以提高性能。 ### JVM架构与实现 JVM架构主要包括以下几个关键组件: - **类加载器...
类装载器负责将.class文件加载到JVM中,并且还负责验证被导入类的正确性、为类变量分配内存并初始化、帮助解析符号引用等。这些操作遵循以下顺序: 1. **装载**:查找并装载类型的二进制数据。 2. **连接**:包含...
JVM提供了一套异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行过程中出现的各种异常情况。此外,JVM还支持自定义异常类型,允许开发者根据实际需求创建特定类型的异常。 #### 平台独立性 Java的...
- 运行时常量池:方法区的一部分,存储编译期生成的各种字面量和符号引用。 4. **垃圾收集(GC)**: - 垃圾收集的目的是自动回收不再使用的对象所占用的内存。 - 分代收集理论:将堆分为新生代(Eden、Survivor...
符号引用指的是类、字段、方法等的名称和描述符,而直接引用可以直接定位到所引用的目标。 #### 初始化 初始化阶段是对类进行初始化的过程,主要是为类的静态变量赋予正确的初始值。这一阶段会执行类构造器`()`,...
Java源码编译机制包括三个主要步骤:分析和输入到符号表、注解处理和语义分析、生成class文件。生成的class文件包含了类的结构信息、元数据、方法信息和字节码等。字节码的执行则依赖于JVM执行引擎,它通过基于栈的...
其中,验证确保字节码的安全性,准备阶段分配静态变量的内存并初始化为默认值,解析将符号引用转换为直接引用。 5. **JVM性能调优**:通过监控和调整JVM的各项参数,如堆大小、新生代与老年代的比例、垃圾收集器的...
此外,JVM采用了符号引用,而非直接的内存地址,来表示非基本类型数据(如类和接口),这有助于实现平台无关性。 JVM的一个关键特性是其内置的垃圾回收机制,它自动管理类实例的生命周期,确保资源的有效利用。另一...
解析阶段将符号引用转换为直接引用;初始化则执行类的静态初始化块。 2. 运行时数据区:包括堆、方法区、程序计数器、虚拟机栈和本地方法栈。堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令...