0

我们所知道的JVMString变量存储在一个单独的StringPool. 每次我们创建一个String (eg. String s1 = "anystring")它时,它都存储为一个常量,当我们创建一个新String变量作为相同的值时,它使用相同的引用,除了创建新的String常量。

我只想知道那个变量在StringPool. 是application level还是JAVA environment level

问题:如果JVM水平,那么不同的应用程序是否使用相同的引用?

我不确定我在String理论上能达到什么程度。但我正在寻找答案。

4

2 回答 2

2

字符串池中对象的生命周期受与任何其他对象相同的规则控制。一个对象只要是可达的就会继续存在。在它变得无法访问之后的一段时间,它将被回收。

与类中的字面量相对应的 String 对象的唯一“不同”之处在于,该对象可通过类的代码访问。通常,类代码的生命周期就是 JVM 的生命周期。但是,如果该类是动态加载的,然后您继续使加载它的类加载器无法访问,等等,那么该类可能会变得无法访问,因此文字对象可能会变得无法访问。

我只想知道 StringPool 中该变量的生命周期是什么。是应用程序级别还是JAVA环境级别。

不清楚您所说的“应用程序级别”和“Java 环境级别”是什么意思,但在正常情况下,正在运行的应用程序的生命周期与 JVM 的生命周期相同。但无论哪种方式,都是由可达性分析决定的;即 GC 用来确定对象是否仍可用于计算的“跟踪”过程。


实际上,您的问题中的这个陈述可以说是不正确的。

我们都知道 JVM 将 String 变量存储在一个单独的 StringPool 中。

事实上,在 Java 7 中,字符串池实际上存储在常规堆中,而不是 permgen 堆。(此外,您实际上是指字符串对象而不是字符串变量。对象和变量根本不是一回事......)

于 2013-05-08T11:43:44.027 回答
0

字符串对象存储在java中的应用程序级别,每个字符串对象都被限制在其类范围内。

于 2013-05-08T11:26:21.153 回答