Java 字符串池中的字符串对象生存期

Java 字符串池中的字符串对象生存期,java,string,lifecycle,pool,Java,String,Lifecycle,Pool,我们只知道JVM将String变量存储在一个单独的StringPool中。 每当我们创建一个字符串(例如String s1=“anystring”)时,它存储为常量&当我们创建新的字符串变量作为相同的值时,它使用相同的引用,除了创建新的字符串常量 我只想知道StringPool中该变量的生命周期是什么。是应用程序级还是JAVA环境级 问题:如果JVMlevel,那么不同的应用程序是否使用相同的引用 我不确定我在String理论中的位置。但我在寻找答案。字符串对象在java中存储在应用程序级别,每

我们只知道
JVM
String
变量存储在一个单独的
StringPool
中。 每当我们创建一个
字符串
(例如String s1=“anystring”)
时,它存储为常量&当我们创建新的
字符串
变量作为相同的值时,它使用相同的引用,除了创建新的
字符串
常量

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

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


我不确定我在
String
理论中的位置。但我在寻找答案。

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

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

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

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

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


事实上,你问题中的这句话可以说是不正确的

我们只知道JVM将字符串变量存储在一个单独的字符串池中


事实上,在Java7中,字符串池实际上存储在常规堆中,而不是permgen堆中。(此外,你的意思是字符串对象而不是字符串变量。对象和变量根本不是一回事……

String
对象也在代码中的某个地方被引用/使用。Java垃圾收集器的工作是根据其约定收集对象引用?我的意思是,你可能只对这一切背后的理论感兴趣,但你是否有一些现实问题需要找到答案?通常情况下,您不应该担心StringPool,只要您的所有代码都使用
“string”.equals(otherString)
-在这种情况下,它只是为了提高效率。JBert,我只想知道string和其他数据类型之间的区别以及JVM如何以不同的方式管理它们。这非常有用,请您详细描述一下您在“字符串对象可以通过类的代码访问”一文中的评论。是的,我意识到我在提问中没有犯什么错误,但基本上我想知道通过JVM/GC管理字符串对象和其他对象的方式有什么不同,代码中有一个指向字符串文本对象的引用。代码中没有引用(例如)代码导致创建的对象。答案是没有区别。