【问题标题】:What if Size of String Pool Exceeds?如果字符串池的大小超过了怎么办?
【发布时间】:2012-04-30 18:07:15
【问题描述】:

在 Java 中,

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

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

【问题讨论】:

  • 常量池中的字符串可以在不再需要时被垃圾回收(即,将它们放在那里的类被卸载)。
  • 如果字符串池的大小超过what

标签: java string


【解决方案1】:

JavaRanch 有一个关于真实代码示例的长时间讨论。

一般输出如下:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2023-03-09
      • 2016-05-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多