假设在同一个http服务器上部署了2个Web应用程序。这两个应用程序是否只有一个String常量池内存,或者它是每个应用程序?
例如:
申请1: String s =“Hello”;
申请2: 字符串t =“Hello”;
在相应的字符串常量池内存中是否会创建2个对象,或者只有一个对象?
答案 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
后显示散列的两个应用程序中放入一些日志记录代码,并且您可以看到相同的散列,则可以确定它们使用相同的池。