常量池和串池的关系

简介: 常量池和串池的关系

字符串在我们日常中大量使用,我们希望通过字节码层面看看我们定义了字符串变量时候是什么行为。我们拿一段代码进行分析:

public class Jvm1_22 {
    public static void main(String[] args) {
        String s1="a";
        String s2="b";
        String s3="ab";
    }
}

我们反编译一下:

javap -v Jvm1_22

我们看关键部分的字节码:

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=4, args_size=1
         0: ldc           #2                  // String a
         2: astore_1
         3: ldc           #3                  // String b
         5: astore_2
         6: ldc           #4                  // String ab
         8: astore_3
         9: return
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      10     0  args   [Ljava/lang/String;
            3       7     1    s1   Ljava/lang/String;
            6       4     2    s2   Ljava/lang/String;
            9       1     3    s3   Ljava/lang/String;

ldc #2表示加载2号位置上的变量操作数栈,astore_1表示把操作数栈顶的值写到变量表的一号槽位中,对应LocalVariableTable上slot的1行中,其他的也是类似。

当我们的程序运行时,常量池中的a b ab这种只是常量符号,还没真正生成对应的字符串对象,需要运行加载操作时候,才会真正生成对象,

当执行ldc #2 时,会生成字符串对象"a"

当执行ldc #3 时会生成字符串对象"b",

当执行ldc #4时候才会生成字符串对象"ab",这种对象生成规律上面是懒惰的。

当生成字符串对象"a"时,字符串对象会以"a"为key去查字符串表中,看下有没有这个对象,没有的话把自己存到字符串表中。

字符串 StringTable [“a”,“b”,“ab”]类似 hashtable结构,不能扩容

目录
相关文章
|
5月前
|
存储 C++
C++:类的内存布局
C++:类的内存布局
|
存储 Java 程序员
深度理解JAVA中的栈、堆、对象、方法区、类和他们之间的关系
1.方法:当一个方法执行时,该方法都会建立自己的内存栈,在该方法内定义的变量将会逐个放入内存栈中,随着方法执行结束,该方法的内存栈也将自然销毁.因此,所有在方法中定义的局部变量都是放在栈内存中的。
289 0
深度理解JAVA中的栈、堆、对象、方法区、类和他们之间的关系
|
5月前
|
编译器 C++
VS2022查看类内存布局
先右键点击属性, 选择左侧的C/C++==>命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局。切切注意, Layout跟指定的结构/类名CTest之间没有空格, 有空格就不对了. 这会只输出指定的结构的内存布局.这个开关输出所有类, 主要是一大堆编译器内部的结构的内存布局, 其实还有一个开关是。
118 0
|
Java Windows
JVM06_方法区的概述、内部结构、演变、常量池、运行时常量池、垃圾回收(二)
③. 方法区的演进细节 ④. 设置方法区大小 ⑤. 常量池的理解
114 0
JVM06_方法区的概述、内部结构、演变、常量池、运行时常量池、垃圾回收(二)
|
关系型数据库 C语言 C++
C++ 对象的内存布局
来源:http://blog.csdn.net/haoel/article/details/3081328 前言 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主
1083 0
|
C++ BI
对象内存布局 (1)
内容概要: 满足下面2个条件时, 1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖) 2. 非虚继承 类对象之内存布局   前述相关内容参考: 1. http://blog.
710 0
|
编译器 BI
对象内存布局 (2)
内容概要: 满足下面2个条件时, 1. 父类有虚函数,子类也有虚函数,但子类并没有重写或覆盖父类的虚函数 2. 非虚继承 类对象之内存布局 如果在Derived类中增加一个下面的虚函数,会怎么样呢?Base类和Derived类之间的关系如下:    新加入的虚函数定义如下: #i...
609 0
对象内存布局 (7)
在对象内存布局 (5)的代码中,在Derived类中覆盖Base1中声明的vfBase1_1(),其他代码不变。修改后的代码如下: #include using namespace std; class Base1 { public: int m_base1; ...
574 0