字符串字面的垃圾收集字符串字面的垃圾收集(Garbage collection of String

2019-05-06 11:16发布

我在阅读有关垃圾收集和我得到混淆的搜索结果,当我搜索字符串文字垃圾收集。

我需要澄清以下几点:

  1. 如果字符串被定义为在编译时字面[例如: String str = "java" ],然后将它被垃圾收集?

  2. 如果使用实习生方法[例如: String str = new String("java").intern() ],然后将它被垃圾收集? 也将它从字符串1点文字区别对待。

  3. 有些地方应提到的是文字会被垃圾收集只有当String类将被卸载? 是否有意义,因为我不认为String类永远不会被卸载。

Answer 1:

如果字符串是在编译时[例如定义为字面: String str = "java"; ],然后将它被垃圾收集?

可能不是。 该代码的对象将包含对一个或多个引用String表示的文本对象。 所以只要在代码对象是可到达的, String对象将是。

这是可能的代码对象变得不可,但前提是它们是动态加载......和他们的类加载器被破坏。

如果我使用实习生方法[例如: String str = new String("java").intern() ],然后将它被垃圾收集?

在返回的对象intern通话将表示同一对象"java"字符串文字。 (在"java"文字是在类加载时间实习。然后,当您实习生新建String在您的代码段的对象,它会查找并返回先前拘留"java"的字符串)。

然而,实习不与字符串文字相同可以被垃圾收集,一旦他们变得不可字符串。 PermGen的空间收集所有近期热点的JVM的垃圾。 (在此之前的Java 8 ...这降低PermGen的全部。)

也将它从字符串中的第1点的文字区别对待。

不......因为它是相同的对象的字符串常量。

事实上,一旦你了解正在发生的事情,很明显,字符串文字不被特殊处理无论是。 这仅仅是“可达性”规则的应用...

有些地方应提到的是文字会被垃圾收集只有当String类将被卸载? 是否有意义,因为我不觉得做String类将永远不会卸载。

你是对的。 它没有意义。 该说的来源是不正确的。 (如果你发布一个网址,这样我们可以阅读他们在说什么为自己这将是有益的...)



Answer 2:

在正常情况下,字符串和类都被分配到JVM的永久代(“PermGen的”),通常永远不会被收集。 被拘留(如字符串mystring.intern()存储在所拥有的内存池String在PermGen的类,它曾经是因为字符串池本身所保持的参考,以每侵略性实习可能导致内存泄露的情况下字符串,即使没有其他的引用存在。 显然,这不再是真实的,至少在JDK 1.6的(例如,参见这里 )。

欲了解更多关于PermGen的, 这是主题的一个体面的概述。 (注:该链接进入与产品相关的博客,我没有与博客,公司或产品有任何关联,但博客条目是有用的,没有太多做的产品。 )



Answer 3:

  1. 只要程序在内存中的文本字符串将保留在内存中。
  2. str将被垃圾收集,但字面是从不会创建。
  3. 这非常有意义,因为程序卸载时,String类被卸载。


Answer 4:

intern()方法检查在字符串池中的对象的可用性。 如果对象/文字可用,那么它的引用将被退回。 如果文字是不存在的池,然后将对象加载在烫发区(字符串池),然后参照它会回报。 我们必须使用intern()明智方法。



文章来源: Garbage collection of String literals