字符串常量池内存

时间:2018-01-14 17:52:57

标签: java string heap-memory

假设在同一个http服务器上部署了2个Web应用程序。这两个应用程序是否只有一个String常量池内存,或者它是每个应用程序?

例如:

申请1: String s =“Hello”;

申请2: 字符串t =“Hello”;

在相应的字符串常量池内存中是否会创建2个对象,或者只有一个对象?

1 个答案:

答案 0 :(得分:1)

常量字符串池是每个JVM进程。如果您有两个应用程序在JVM实例中运行(即您可以在进程列表中看到两个java进程),则会有两个不同的池。

如果我们正在谈论,例如在同一HTTP服务器上运行的两个Web应用程序将共享同一个池。

所以这取决于你的意思"应用"和"服务器"但我认为这篇文章应该回答所有的变化。

有一种方法可以找出两个应用程序是否使用String#intern共享同一个池:

public class StringPoolTest {

    public final static void main(String[] args) {
        String s1 = "Hello";
        String s2_1 = "H";
        String s2_2 = "ello";
        String s2 = s2_1 + s2_2;

        System.out.println("s1 identity: " + System.identityHashCode(s1));
        System.out.println("s2 identity: " + System.identityHashCode(s2));

        s1 = s1.intern();
        s2 = s2.intern();

        System.out.println("s1 identity: " + System.identityHashCode(s1));
        System.out.println("s2 identity: " + System.identityHashCode(s2));
    }
}

调用intern后,第二组System.out.println显示相同的ID:

  

s1身份:366712642

     

s2身份:1829164700

     

s1身份:366712642

     

s2身份:366712642

如果您在同一文本上调用intern后显示散列的两个应用程序中放入一些日志记录代码,并且您可以看到相同的散列,则可以确定它们使用相同的池。