从answer可以清楚地看出,每个应用程序都将在特定的Java虚拟机实例中运行。从这个post可以清楚地看出,java字符串是不可变的,JVM预留了一个特殊的内存区域"字符串常量池"存储字符串。
我的问题是如果每个Web应用程序或JVM都有一个共享的String常量池,或者每个Web应用程序和jvm实例都有一个单独的String常量池。
答案 0 :(得分:3)
不能在不同的JVM之间共享字符串池。它被实现为对每个JVM的特定堆中的实际String
对象的引用的哈希表。由于对不同堆的引用不兼容,因为每个JVM都有自己的逻辑地址空间,所以无法共享哈希表。
有一种机制可以在JVM Class Data Sharing之间共享公共数据,它使用预处理形式的公共库,通常是JRE。除了类和成员定义以及字节代码之外,这自然包含所有字符串常量,但这只是数据,使用数据创建Java String
对象具有不同的标识并且添加对池的引用仍然受每个JVM的约束。