【问题标题】:Is there any way to "flush" interned strings?有没有办法“刷新”实习字符串?
【发布时间】:2011-01-15 09:12:29
【问题描述】:

出于性能原因,我正在使用一个使用 String.intern() 的外部库。这很好,但是我在给定的运行中很多调用了那个库,所以我遇到了可怕的

java.lang.OutOfMemoryError: PermGen 空间

显然我可以使用 JVM 命令行 -XX:MaxPermSize 修饰符,但该解决方案的可扩展性不是很好。相反,有没有办法定期(在两个“批次”库调用之间)“刷新”实习字符串池,即清空 String 类持有的静态字符串表?

【问题讨论】:

  • 我想“好”的定义需要重新评估:p
  • @pst yea :) 我的意思是这些字符串是有充分理由的,足够好,我不想在每次调用后“刷新”该表,或者完全阻止实习 -我只想在每次“批次”调用后刷新它,以便在每个批次中,库仍然可以享受先前调用的实习。
  • 奇怪 - 只是读到 article 说,现代 JVM 将 gc 实习字符串。也许您保留了对未使用的 String 对象的许多引用?

标签: java string memory-management string-interning


【解决方案1】:

没有。只需适当调整 permgen 的大小。必须适当地调整堆大小没有什么不同。不要害怕!

【讨论】:

    【解决方案2】:

    进一步调查,我发现了this article,这似乎表明实习字符串仍在被垃圾收集。我想这意味着我这里的问题是一个更深层次的问题——我使用的库必须仍然对这些字符串保持有效的引用:(

    【讨论】:

    • 你就不能......有点杀死图书馆的所有参考并“重新开始”每批。如果我没看错,GC 应该为“旧”的实习字符串启动,你可能会高兴吗?
    • @Nanne 该库大量使用静态变量(不寒而栗)。它为他们提供了一个不错的 reset() 小函数,我依赖它,但我想它是不完整的。
    • 无赖 ;) 有趣的文章 ;)
    猜你喜欢
    • 2012-05-31
    • 2010-10-25
    • 2018-05-26
    • 2019-11-28
    • 2015-02-26
    • 1970-01-01
    • 2022-01-16
    • 2016-01-11
    • 2016-12-14
    相关资源
    最近更新 更多