如果一个字符串在编译时被定义为文字 [eg: String str = "java";
] 那么它会被垃圾收集吗?
可能不是。代码对象将包含一个或多个对String
表示文字的对象的引用。所以只要代码对象是可访问的,String
对象就会到。
代码对象可能无法访问,但前提是它们是动态加载的……并且它们的类加载器被销毁。
如果我使用实习生方法 [eg: String str = new String("java").intern()
] 那么它会被垃圾收集吗?
调用返回的对象intern
将与表示"java"
字符串文字的对象相同。("java"
文字在类加载时被实习。当您String
在代码片段中实习新构造的对象时,它将查找并返回先前实习的"java"
字符串。)
但是,与字符串文字不相同的实习字符串一旦变得无法访问,就会被垃圾回收。PermGen 空间是在所有最近的 HotSpot JVM 上收集的垃圾。(在 Java 8 之前……它完全放弃了 PermGen。)
它也将与第 1 点中的字符串文字区别对待。
不......因为它与字符串文字是同一个对象。
事实上,一旦你了解了发生了什么,很明显字符串文字也没有被特殊对待。它只是“可达性”规则的应用......
有些地方提到只有在String
卸载类时才会对文字进行垃圾收集?这是否有意义,因为我认为String
该类永远不会被卸载。
你说的对。这没有意义。说那是不正确的消息来源。(如果您发布一个 URL 会很有帮助,这样我们就可以阅读他们自己所说的内容......)