我在阅读有关垃圾收集和我得到混淆的搜索结果,当我搜索字符串文字垃圾收集。
我需要澄清以下几点:
如果字符串被定义为在编译时字面[例如: String str = "java"
],然后将它被垃圾收集?
如果使用实习生方法[例如: String str = new String("java").intern()
],然后将它被垃圾收集? 也将它从字符串1点文字区别对待。
有些地方应提到的是文字会被垃圾收集只有当String
类将被卸载? 是否有意义,因为我不认为String
类永远不会被卸载。
如果字符串是在编译时[例如定义为字面: String str = "java";
],然后将它被垃圾收集?
可能不是。 该代码的对象将包含对一个或多个引用String
表示的文本对象。 所以只要在代码对象是可到达的, String
对象将是。
这是可能的代码对象变得不可,但前提是它们是动态加载......和他们的类加载器被破坏。
如果我使用实习生方法[例如: String str = new String("java").intern()
],然后将它被垃圾收集?
在返回的对象intern
通话将表示同一对象"java"
字符串文字。 (在"java"
文字是在类加载时间实习。然后,当您实习生新建String
在您的代码段的对象,它会查找并返回先前拘留"java"
的字符串)。
然而,实习不与字符串文字相同可以被垃圾收集,一旦他们变得不可字符串。 PermGen的空间是收集所有近期热点的JVM的垃圾。 (在此之前的Java 8 ...这降低PermGen的全部。)
也将它从字符串中的第1点的文字区别对待。
不......因为它是相同的对象的字符串常量。
事实上,一旦你了解正在发生的事情,很明显,字符串文字不被特殊处理无论是。 这仅仅是“可达性”规则的应用...
有些地方应提到的是文字会被垃圾收集只有当String
类将被卸载? 是否有意义,因为我不觉得做String
类将永远不会卸载。
你是对的。 它没有意义。 该说的来源是不正确的。 (如果你发布一个网址,这样我们可以阅读他们在说什么为自己这将是有益的...)
在正常情况下,字符串和类都被分配到JVM的永久代(“PermGen的”),通常永远不会被收集。 被拘留(如字符串mystring.intern()
存储在所拥有的内存池String
在PermGen的类,它曾经是因为字符串池本身所保持的参考,以每侵略性实习可能导致内存泄露的情况下字符串,即使没有其他的引用存在。 显然,这不再是真实的,至少在JDK 1.6的(例如,参见这里 )。
欲了解更多关于PermGen的, 这是主题的一个体面的概述。 (注:该链接进入与产品相关的博客,我没有与博客,公司或产品有任何关联,但博客条目是有用的,没有太多做的产品。 )
intern()
方法检查在字符串池中的对象的可用性。 如果对象/文字可用,那么它的引用将被退回。 如果文字是不存在的池,然后将对象加载在烫发区(字符串池),然后参照它会回报。 我们必须使用intern()
明智方法。