JVM内存结构之运行时常量池

JVM中的运行时常量池是Java虚拟机在运行时动态创建的,它包含了类文件中所定义的各种常量,如字符串常量、类名和方法名、接口名等。除了这些常量之外,还包括了一些符号引用,它们指向类和接口的运行时常量池、字段和方法的符号引用,以及其他一些信息。运行时常量池是在类加载时创建的,并且与每个类都有关联。

运行时常量池是JVM中的一部分,它具有以下特点:

动态性:运行时常量池是在类加载时创建的,因此它具有一定的动态性。如果一个常量的值是在运行时计算得到的,那么该常量在运行时常量池中就不是一个真正的常量,它只是一个变量。

存储位置:在JVM中,运行时常量池是在方法区中分配的。

垃圾回收:运行时常量池可以被垃圾回收器回收。当一个类被卸载时,它所对应的运行时常量池中的内容也会被回收。

下面是一个例子,演示了Java程序中运行时常量池的使用:

public class ConstantPoolExample {
    public static void main(String[] args) {
        String str1 = "Hello, world!"; // 这个字符串常量在常量池中创建
        String str2 = "Hello, world!"; // 由于常量池中已经存在 "Hello, world!",所以这个字符串常量直接引用常量池中的对象
        String str3 = new String("Hello, world!"); // 这个字符串对象在堆中创建
        System.out.println(str1 == str2); // true
        System.out.println(str1 == str3); // false
    }
}

在上面的例子中,由于 str1 和 str2 都是字符串常量,它们指向了运行时常量池中的同一个对象,因此比较它们的引用相等。而 str3 是通过 new 操作符在堆中创建的,它指向的是一个新的对象,所以和 str1 的引用不相等。