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

在Java中

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

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

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

一般输出如下:

  1. 如果使用String.intern()将字符串添加到RUNTIME的常量池中,则在不再使用它之后可以对其进行垃圾回收。 最有可能的是,字符串池只保留对添加的字符串的软引用,因此允许垃圾收集它们(不能确定,因为String.intern()是本机方法)。
  2. 如果字符串是COMPILE时间常量,则将其添加到相应类的常量池中。 因此,只有在卸载类后才可以对其进行垃圾回收。

您的问题的答案是:由于String常量而导致OutOfMemoryError的唯一方法是使用在编译时计算的许多字符串文字来加载很多类。 然后,您最终可以超过PermGen空间的最大大小。 但是这会在您将类加载到内存中时发生(例如,启动应用程序,将项目部署到WebServer,动态加载新库等)

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

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

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