美文网首页
java虚拟机运行时常量池

java虚拟机运行时常量池

作者: pianpianboy | 来源:发表于2018-02-28 22:17 被阅读0次

java虚拟机运行时常量池

时间:20180228


  运行时常量池是方法区的一部分。Class文件(也就是.java文件编译后生成的字节码.class文件)中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用()。这部分内容将在类加载后进入方法区的运行时常量池中存放。
  常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:

  • 类和接口的全限定名
  • 字段名称和描述符
  • 方法名称和描述符

  一般来说除了保存class文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。
  运行时常量池与Class文件常量池的区别
  运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性。运行期间也能将新的常量放入池中,比如String类的intern()方法。

举例:

package com.test5;

public class Test {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);
        String s3 = new String("abc");
        String s4 = new String("abc");
        System.out.println(s1 == s2);
        //基本数据类型和抽象数据类型都会放在局部变量表中(虚拟机栈的栈帧中)
        //String 是抽象数据类型,抽象数据类型存放的是引用,
        System.out.println("s1 == s2? :" + (s1 == s2));
        //System.out.println("s1 == s2?" + s1 == s2);返回结果为 false为什么?
        System.out.println("s1 == s3? :" + (s1 == s3));
        System.out.println("s1 == s3? :" + (s1 == s3.intern()));
        System.out.println("s3 == s4? :" + (s3 == s4));
    }
}

结果:

true
true
s1 == s2? :true
s1 == s3? :false
s1 == s3? :true
s3 == s4? :false

图解分析

图解分析

文字分析

String s1 = "abc";
  String是抽象数据类型,而抽象数据类的引用(抽象数据类型变量)s1存放在局部变量表中。(此处时s1本身也就是局部变量,理应存放在局部变量表中???)。"abc"为字符串,字符串的创建都存放在运行时常量池。字符串为字面量(Literal),常量池主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。
String s2 = "abc";
  s2的分析同上。只是需要注意的是在常量池中存储的数据都是不重复的。此时s1和s2都指向常量池中同一块区域。因此s1==s2返回true;
String s3 = new String("abc");
  而new创建的是对象实例,存储在堆中。s3指向堆中某一块区域,因此s1!=s3;

相关文章

  • Java基础(6)—Java虚拟机 JVM

    JAVA基础知识学习 JAVA虚拟机 基础知识:方法区(运行时常量池):用于存放已被虚拟机加载的类信息、常量、静态...

  • java虚拟机运行时常量池

    java虚拟机运行时常量池 时间:20180228   运行时常量池是方法区的一部分。Class文件(也就是.ja...

  • JVM入门

    Java虚拟机内存包括: 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池、直接内存。 ...

  • 细说Java常量池

      Java中的常量池有:class常量池、运行时常量池、String常量池。 为什么要使用常量池?   避免频繁...

  • 深入理解JVM之Java内存区域与内存溢出异常

    运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 HotSpot虚拟机...

  • 第二章 java内存区域与内存溢出异常

    运行时数据区域 实战 OutOfMemoryError异常 java堆溢出 虚拟机栈和本地方法栈溢出 运行时常量池...

  • String.intern()、String、StringBui

    1. String.intern() 看《深入理解Java虚拟机》提到运行时常量池(Runtime Constan...

  • 你对常量池够了解吗

    在 java 中,常量池分为以下三种: class 常量池 字符串常量池 运行时常量池 一、class 常量池 1...

  • JVM——运行时数据区

    JVM的简化架构 运行时数据区 包括:程序计数器(PC寄存器)、Java虚拟机栈、Java堆、方法区、运行时常量池...

  • Java 内存—常量池

    Java中的常量池分为两种型态: 静态常量池 运行时常量池 静态常量池 所谓静态常量池是指class文件中的常量池...

网友评论

      本文标题:java虚拟机运行时常量池

      本文链接:https://www.haomeiwen.com/subject/ceqbxftx.html