`

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_高级特性与最佳实践

    / 29 2.2.7 直接内存 / 29 2.3 对象访问 / 30 2.4 实战:OutOfMemoryError异常 / 32 2.4.1 Java堆溢出 / 32 2.4.2 虚拟机栈和本地方法栈溢出 / 35 2.4.3 运行时常量池溢出 / 38 2.4.4 方法区溢出 / 39 2.4.5...

    JVM执行子系统-JVM进阶

    Class 类文件结构 Java 跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是 ...常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 java虚拟机中内置的安全特性 3.6 安全管理器和java api 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 3.11 访问控制器 ...

    JVM常量池教程吐血整理干货.md

    符号引用: 符号引用包括三种:类的全限定名,方法名和描述符,字段名和描述符。 Class文件常量池 运行时常量池 运行时常量池是在类加载阶段,将class二进制数据加载到内存, 并将数据保存到方法区,其中class文件中...

    Java常见面试问题整理.docx

    运行时常量池是方法区的一部分,class文件除了有类的字段、接口、方法等描述信息之外,还有常量池用于存放编译期间生成的各种字面量和符号引用。在老版jdk,方法区也被称为永久代。在1.8之后,由于永久代内存经常...

    java面试宝典

    41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名...

    java8rt.jar源码-mini-jvm:Go语言实现的JVM,实现了部分字节码的解释执行,学习JVM使用

    执行过程中如果遇到新的类符号引用,则会通过全限定性名再从classpath中加载新的类文件,以此类推; 控制台输出、多线程功能通过自定义的标准库"mini-lib"中的Printer和MiniThread实现,没有使用JDK的标准库Thread,...

    关于JVM的总结

    解析:将常量池中的符号引用替换为直接引用的过程,虚拟机不会重新再解析而是通过缓存去拿出解析的数据 初始化:在准备阶段已经赋过一个系统要求的初始值,而在初始化阶段则通过程序制定的主管计划去初始化变量和其他...

    JAVA--达内培训笔记

    java中没有sizeof这个关键字了,java中的boolean类型的值只能用true和false,且这两个也是关键字 enum 枚举 assert 断言 一个标识符尽量符合语义信息,提高程序可读性 类 名 :每个单词首字母大写, 变量和...

    java编程基础,应用与实例

    1.2.3 Java Virtual Machine(JVM) 2 1.2.4 面向对象的程序设计语言 2 1.2.5 线程(thread) 2 1.2.6 垃圾回收机制(garbage collection) 2 1.3 安装Java程序开发工具(JDK1.5) 2 1.3.1 安装JAVA 2 Standard ...

    Java虚拟机

    增加了大量处理各种常见JVM问题的技巧和最佳实践;增加了若干与生产环境相结合的实战案例;对第1版中的错误和不足之处的修正;等等。 第2版不仅技术更新、内容更丰富,而且实战性更强。全书共分为五大部分,围绕...

    jdk-12_osx-x64_bin.tar.gz

    在新的 java.lang.invoke.constant 包中定义了一系列基于值的符号引用(JVMS 5.1)类型,它们能够描述每种可加载常量。符号引用以纯 nominal 形式描述可加载常量,与类加载或可访问性上下文区分开。有些类可以作为...

    java版2048源码下载-jvm:实战虚拟机

    java版2048源码下载 实战JAVA虚拟机 java语言规范 语法,词法,支持的数据类型,变量类型,数据类型转换的约定,数组,异常等,告诉开发人员“java代码应该怎么样写” 词法 什么样的单词是对的。 整数可以有下划线 ...

    RodJohn#jvm#内存区域_运行时常量池1

    常量池静态常量池即*.class文件中的常量池,用于存放字面量和符号引用运行时常量池是jvm运行期间,存储常量的数据结构运行时常量池概念运行时常量池(Runti

    Java 高级特性.doc

    5.在JAVA的程序中,我经常性的看到字符前面有@这种标志的符号.这个就叫做注解! 下面是使用 @SuppressWarnings 来取消 deprecation 警告的一个例子: public class Test { @Deprecated //在eclipse下运行的时候,...

    java源码debug-Java-Subset-Compiler-Debugger:为Java的子集语言而构建的编译器,目的是在JVM上模拟源

    这些标记放在抽象语法树上,然后由类型检查约束,并引用符号表。 字节码是从这个经过修饰的抽象语法树生成的,然后将其放入运行时堆栈以形成字节码程序。 然后,字节码程序由我们的抽象虚拟机解释。 临时调试器的...

    JVM--字节码和类的加载篇1

    声明为final的常量值符号引用类和接口的全限定名字段的名称和描述符方法的名称和描述符标志符含义基本数据类型 byte基本数据类型 char基本数据类型 dou

    java8stream源码-java-8-practice:Java8新特性实践

    编程、JVM、工具和库的各种升级。 Java 8 是 Java 历史上功能最丰富的版本之一。 Java 8 提供以下新功能/增强功能: Lambda 表达式 方法参考, 功能接口 默认方法 流和管道 选修课 字符串连接器 新的日期 API Base64...

    千方百计笔试题大全

    41、Java 的接口和C++的虚类的相同和不同处。 12 42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名...

    玩转Java虚拟机(一)

    从今天开始打卡学习JVM,第一天 本人学习过程中所整理的代码,源码地址 – 类加载 在Java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成...解析 -&gt; 把类中的符号引用转换为直接引用 初始化:为类的静态变

Global site tag (gtag.js) - Google Analytics