如果字符串池的大小超过怎么办?

时间:2012-04-19 08:39:11

标签: java string

在Java中,

字符串常量池中的字符串文字不是垃圾回收, 因为它们是从运行时实例创建的引用表中引用的,以便优化空间。

如果字符串文字池的大小超过那么, 由于String文字池中的每个String都有引用,因此它不符合GC的条件。 它是如何由JVM处理的?

2 个答案:

答案 0 :(得分:11)

JavaRanch处与实际代码示例进行了长时间的讨论。

一般输出如下:

  1. 如果使用String.intern()将字符串添加到RUNTIME的常量池中,则可以在不再使用后进行垃圾回收。最有可能的是,字符串池只保留对添加的字符串的软引用,因此允许对它们进行垃圾收集(不能确定,因为String.intern()是本机方法)。
  2. 如果字符串是COMPILE时间常量,则将其添加到相应类的常量池中。因此,只有在卸载类后才可以对其进行垃圾回收。
  3. 您的问题的答案是:由于String常量,如何获得OutOfMemoryError的唯一方法是加载很多类,其中包含许多在编译时计算的字符串文字。然后,您最终可以超过PermGen空间的最大大小。但是,这会在您将类加载到内存中时发生(例如,启动应用程序,将项目部署到WebServer,动态加载新库等)。

答案 1 :(得分:3)

当不再需要字符串文字时,可以收集它们。如果它们出现在类中,通常这不是问题,因为如果您尝试加载许多类,可能会达到其他限制,例如最大烫发。

一般来说,开发人员足够聪明,不要过度使用字符串文字池,而是使用数据库或文件加载大量数据,如果它的大小非常重要。

如果为了优化系统空间而大量使用String.intern(),则可能会引入问题。如果向其中添加大量(数百万)字符串,String.intern()不是免费的并且变得越来越昂贵。如果这是一个性能问题,那么开发人员应该是合理的。