StringPool中的String对象生命周期

时间:2013-05-08 11:21:46

标签: java string lifecycle pool

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

我只想知道StringPool中该变量的生命是什么。是application level还是JAVA environment level

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

我不确定在String理论中我在做什么。但我正在寻找答案。

2 个答案:

答案 0 :(得分:2)

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

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

  

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

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


实际上,你的问题中的这个陈述可能是不正确的。

  

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

实际上,在Java 7中,字符串池实际存储在常规堆中,而不是permgen堆中。 (此外,你真的意味着String对象不是String变量。对象和变量根本不是同一个东西......)

答案 1 :(得分:0)

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