在Java中,
字符串常量池中的字符串文字不是垃圾回收, 因为它们是从运行时实例创建的引用表中引用的,以便优化空间。
如果字符串文字池的大小超过那么, 由于String文字池中的每个String都有引用,因此它不符合GC的条件。 它是如何由JVM处理的?
答案 0 :(得分:11)
在JavaRanch处与实际代码示例进行了长时间的讨论。
一般输出如下:
您的问题的答案是:由于String常量,如何获得OutOfMemoryError的唯一方法是加载很多类,其中包含许多在编译时计算的字符串文字。然后,您最终可以超过PermGen空间的最大大小。但是,这会在您将类加载到内存中时发生(例如,启动应用程序,将项目部署到WebServer,动态加载新库等)。
答案 1 :(得分:3)
当不再需要字符串文字时,可以收集它们。如果它们出现在类中,通常这不是问题,因为如果您尝试加载许多类,可能会达到其他限制,例如最大烫发。
一般来说,开发人员足够聪明,不要过度使用字符串文字池,而是使用数据库或文件加载大量数据,如果它的大小非常重要。
如果为了优化系统空间而大量使用String.intern(),则可能会引入问题。如果向其中添加大量(数百万)字符串,String.intern()不是免费的并且变得越来越昂贵。如果这是一个性能问题,那么开发人员应该是合理的。