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

ked*_*the 9 java string

在Java中

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

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

And*_*y L 11

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

一般输出如下:

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

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


Pet*_*rey 3

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

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

如果您大量使用 String.intern() 来尝试优化系统空间,则可能会带来问题。String.intern() 不是免费的,如果向其中添加大量(数百万)字符串,它会变得越来越昂贵。如果这是一个性能问题,那么对于开发人员来说,它应该是相当明显的。