如果在编译时将字符串定义为文字[例如:String str = "java";
]那么它会被垃圾收集?
可能不是。代码对象将包含对表示文字的String
对象的一个或多个引用。所以只要代码对象可达,String
对象就会到达。
代码对象可能无法访问,但前提是它们是动态加载的......并且它们的类加载器被破坏。
如果我使用实习方法[e。g:String str = new String("java").intern()
]那么它会被垃圾收集?
intern
调用返回的对象将是表示"java"
字符串文字的相同对象。 (该"java"
文字是在类加载时间实习。然后,当您实习生新构造String
对象在您的代码段,它会查找并返回先前实习"java"
字符串)。
然而,实习是不相同的字符串字符串文字可以垃圾收集一旦变得无法访问。 PermGen空间是在所有最近的HotSpot JVM上收集的垃圾。 (现有到Java 8 ...而下降的PermGen完全。)
而且将它从字符串文本区别对待在点1
否...因为它是相同的对象字符串文字。
事实上,一旦你明白发生了什么,很明显字符串文字也没有被特别处理。这只是“可达性”规则的应用...
有些地方提到文字将被垃圾收集只有当String
类将被卸载?这是否有意义,因为我认为String
类不会被卸载。
你说得对。这没有意义。说这些来源是不正确的。 (如果您发布了一个URL,以便我们可以阅读他们正在说的内容,这将对您有所帮助...)
1 - http://stackoverflow.com/questions/2202162/garbage-collection-and-strings; 2 - http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java; 3 - String a = new String(“asd”) - >“a”引用将被垃圾回收,但只是对“asd”的引用,并且“asd”将永远存在。 – user1050755 2013-03-10 15:54:52
如果你搜索更多,你会发现提到的地方使用实习生创建的字符串文字可以垃圾收集,因为他们使用弱参考,但我不能确认它,这就是为什么我张贴的原因,因为有很多混合的反应。 – Lokesh 2013-03-10 15:57:50