我们都知道JVM
将String
个变量存储在单独的StringPool
中。
每次我们创建String
(eg. String s1 = "anystring")
时,它都会存储为常量&当我们将新的String
变量创建为相同的值时,除了创建新的String
常量外,它使用相同的引用。
我只想知道StringPool
中该变量的生命是什么。是application level
还是JAVA environment level
。
问题:如果JVM
级别,那么不同的应用程序是否使用相同的引用?
我不确定在String
理论中我在做什么。但我正在寻找答案。
答案 0 :(得分:2)
字符串池中对象的生命周期由与任何其他对象相同的规则控制。只要可达,对象就会继续存在。 无法访问之后的一段时间,它将被回收。
对于与类中的文字对应的String对象,唯一“不同”的是该对象可通过类的代码访问。通常,类的代码的生命周期是JVM的生命周期。但是,如果该类是动态加载的,然后您继续使加载它的类加载器无法访问,等等,那么该类可能无法访问,因此文字对象可能无法访问。
我只想知道StringPool中该变量的生命是什么。是应用程序级别还是JAVA环境级别。
“应用程序级别”和“Java环境级别”的含义尚不清楚,但在正常情况下,正在运行的应用程序的生命周期与JVM的生命周期相同。但无论哪种方式,都是由可达性分析决定的;即GC用于确定对象是否仍可用于计算的“跟踪”过程。
实际上,你的问题中的这个陈述可能是不正确的。
我们都知道JVM将String变量存储在单独的StringPool中。
实际上,在Java 7中,字符串池实际存储在常规堆中,而不是permgen堆中。 (此外,你真的意味着String对象不是String变量。对象和变量根本不是同一个东西......)
答案 1 :(得分:0)
String对象存储在java的应用程序级别,每个字符串对象都限制在其类范围内。