出于性能原因,我正在使用一个使用 String.intern() 的外部库。很好,但是我在给定的运行中经常调用那个库,所以我遇到了可怕的
java.lang.OutOfMemoryError: PermGen 空间
显然我可以使用 JVM 命令行-XX:MaxPermSize
修饰符,但该解决方案的可扩展性不是很高。相反,有没有办法定期(在两个“批次”库调用之间)“刷新”实习字符串池,即清空 String 类持有的字符串静态表?
出于性能原因,我正在使用一个使用 String.intern() 的外部库。很好,但是我在给定的运行中经常调用那个库,所以我遇到了可怕的
java.lang.OutOfMemoryError: PermGen 空间
显然我可以使用 JVM 命令行-XX:MaxPermSize
修饰符,但该解决方案的可扩展性不是很高。相反,有没有办法定期(在两个“批次”库调用之间)“刷新”实习字符串池,即清空 String 类持有的字符串静态表?
不,只要适当调整 permgen 的大小即可。必须适当地调整堆大小没有什么不同。不要害怕!
进一步调查,我发现了这篇文章,它似乎证明了实习字符串仍然是垃圾收集的。我想这意味着我的问题是一个更深层次的问题——我使用的库必须仍然对这些字符串保持有效的引用:(