`

java中的直接引用和符号引用下JVM的不同处理

    博客分类:
  • java
阅读更多

总结: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

}

分享到:
评论

相关推荐

    Java JVM Instruction Set

    这有助于更深入地理解JVM如何处理不同类型的对象引用和方法分派。 综上所述,Java虚拟机指令集是Java程序执行的关键组成部分。通过深入研究JVM的工作原理和指令集,可以帮助我们更好地理解和优化Java程序的性能。

    java基础之JVM

    4. **解析**:将符号引用转换为直接引用。 5. **初始化**:为类的静态变量赋初始值。 **2.2 加载.class文件的方式** 加载`.class`文件的方式多样,常见的有: 1. **从本地系统直接加载**:最常见的加载方式,从...

    JAVA虚拟机(JVM)规范(中文版).rar

    4. **解析**:将符号引用转换为直接引用。 5. **初始化**:执行类的初始化方法(),初始化静态变量和执行静态块。 ### 运行时数据区 1. **方法区**:存储类信息、常量、静态变量等。 2. **堆**:所有对象实例都在...

    java中JVM(学习资料)

    4. 解析:将符号引用转换为直接引用,以便于后续的访问。 5. 初始化:执行类的初始化方法,如静态块。 6. 执行:解释或编译字节码为机器码,然后在CPU上运行。 JVM的启动过程涉及查找JRE路径,通常是通过JDK中的...

    java模拟jvm

    4. **解析**:将符号引用转换为直接引用,以便后续直接访问。 5. **初始化**:执行类的静态初始化块。 五、运行结果文档 该项目提供的运行结果文档可能包含了模拟JVM运行示例程序后得到的各种状态信息,如内存使用...

    JVM的运行机制

    - **解析**:将符号引用转换为直接引用,以便在运行时定位类和方法。 - **初始化**:执行类的静态初始化代码块。 - **执行**:JVM解释器将字节码转化为机器码执行,现代JVM通过即时编译(JIT)技术进一步提高性能...

    JVM内幕:java虚拟机详解

    - 符号表包含了类中的字段符号引用和方法符号引用。 12. **Interned字符串(Interned String)** - Interned字符串指的是通过`String.intern()`方法得到的字符串,这些字符串被存储在一个特殊的池中,以节省内存。...

    java中jvm原理和实现

    4. **解析**: 将符号引用转换为直接引用。 5. **初始化**: 执行类构造器`&lt;clinit&gt;`方法,对静态变量赋初始值。 类加载器不仅处理了类的加载,还管理着类之间的依赖关系。例如,当一个类引用了另一个类时,类加载器...

    【狂神说Java】JVM快速入门篇

    4. **解析**:将符号引用转换为直接引用,为方法调用和字段访问做准备。 5. **初始化**:执行类的初始化方法(),包括静态变量的显示初始化和静态块的执行。 四、垃圾收集 JVM的垃圾收集是自动管理内存的过程,...

    JVM.rar_java 工作流_java 虚拟机_jvm_jvm hook_虚拟机 Java

    加载是找到并读取类文件,验证确保字节码的安全性,准备分配类变量内存并设置初始值,解析将符号引用转为直接引用,初始化执行类初始化方法。 在执行字节码时,JVM采用解释器和即时编译器(JIT)的混合模式。解释器...

    jvm中文规范简介

    JVM规范详细定义了Java可执行代码(即字节码)的格式,包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象和常量缓冲池在JVM中的存储映像。 这些定义为JVM解释器的开发人员提供了...

    java的执行原理和JVM

    4. **解析**:将符号引用转换为直接引用。 5. **执行**:解释执行字节码,或者通过即时编译器(JIT)将热点代码编译成本地机器码以提高性能。 ### JVM架构与实现 JVM架构主要包括以下几个关键组件: - **类加载器...

    深入JVM整理文档

    类装载器负责将.class文件加载到JVM中,并且还负责验证被导入类的正确性、为类变量分配内存并初始化、帮助解析符号引用等。这些操作遵循以下顺序: 1. **装载**:查找并装载类型的二进制数据。 2. **连接**:包含...

    JVM(Java 虚拟机)的详细讲解

    JVM提供了一套异常处理机制,通过try-catch-finally语句块来捕获和处理程序运行过程中出现的各种异常情况。此外,JVM还支持自定义异常类型,允许开发者根据实际需求创建特定类型的异常。 #### 平台独立性 Java的...

    狂神说JVM探究.rar

    - 运行时常量池:方法区的一部分,存储编译期生成的各种字面量和符号引用。 4. **垃圾收集(GC)**: - 垃圾收集的目的是自动回收不再使用的对象所占用的内存。 - 分代收集理论:将堆分为新生代(Eden、Survivor...

    jvm工作机制

    符号引用指的是类、字段、方法等的名称和描述符,而直接引用可以直接定位到所引用的目标。 #### 初始化 初始化阶段是对类进行初始化的过程,主要是为类的静态变量赋予正确的初始值。这一阶段会执行类构造器`()`,...

    JVM原理讲解和调优,详细讲解JVM底层

    Java源码编译机制包括三个主要步骤:分析和输入到符号表、注解处理和语义分析、生成class文件。生成的class文件包含了类的结构信息、元数据、方法信息和字节码等。字节码的执行则依赖于JVM执行引擎,它通过基于栈的...

    java虚拟机

    其中,验证确保字节码的安全性,准备阶段分配静态变量的内存并初始化为默认值,解析将符号引用转换为直接引用。 5. **JVM性能调优**:通过监控和调整JVM的各项参数,如堆大小、新生代与老年代的比例、垃圾收集器的...

    深入理解JVM内幕:从基本结构到Java 7新特性

    此外,JVM采用了符号引用,而非直接的内存地址,来表示非基本类型数据(如类和接口),这有助于实现平台无关性。 JVM的一个关键特性是其内置的垃圾回收机制,它自动管理类实例的生命周期,确保资源的有效利用。另一...

    jdk,jvm源码

    解析阶段将符号引用转换为直接引用;初始化则执行类的静态初始化块。 2. 运行时数据区:包括堆、方法区、程序计数器、虚拟机栈和本地方法栈。堆存储对象实例,方法区存放类信息,程序计数器记录当前线程执行的指令...

Global site tag (gtag.js) - Google Analytics