我正在阅读有关垃圾收集的内容,当我搜索字符串文字垃圾收集时,我会得到令人困惑的搜索结果。
我需要澄清以下几点:
String str = "java"
)被定义为文字,那么它会被垃圾收集吗?String str = new String("java").intern()
),那么它会被垃圾收集吗?此外,在第1点中,它是否与字符串文本有不同的处理方式。String
类时才会垃圾收集文字?这是否有意义,因为我认为String
类永远不会被卸载。发布于 2013-03-10 08:15:37
如果一个字符串在编译时(例如:
String str = "java";
)被定义为文字,那么它会被垃圾收集吗?
可能不会。代码对象将包含对表示文本的String
对象的一个或多个引用。因此,只要代码对象是可访问的,String
对象就会到达。
代码对象可能变得不可访问,但前提是它们是动态加载的.他们的类装载机也被毁了。
如果我使用实习生方法,例如:
String str = new String("java").intern()
,那么它会被垃圾收集吗?
intern
调用返回的对象将是表示"java"
字符串文本的相同对象。( "java"
文本在类加载时被嵌入。然后,当您在代码片段中实习生新构造的String
对象时,它将查找并返回以前被嵌入的"java"
字符串。)
但是,与字符串文本不相同的内部字符串一旦变得不可访问,就会被垃圾收集。PermGen空间是在所有最近的HotSpot JVM上收集的垃圾。(在Java 8之前.这完全降低了PermGen。)
此外,在第1点中,它是否与字符串文本有不同的处理方式。
不..。因为它是与字符串文本相同的对象。
事实上,一旦您了解了正在发生的事情,很明显,字符串文本也没有得到特别的处理。这只是“可达性”规则的一个应用.
有些地方提到,只有在卸载
String
类时才会垃圾收集文字?这是否有意义,因为我认为String
类永远不会被卸载。
你是正确的。这没有意义。说这是不正确的消息来源。(如果你发布了一个URL,这样我们就能读到他们为自己说的话,这将是有帮助的。)
发布于 2013-03-10 07:57:57
发布于 2013-03-10 07:58:54
str
将被垃圾收集,但是它创建的文字不会。https://stackoverflow.com/questions/15324143
复制相似问题