在Java中
字符串常量池中的字符串文字不是垃圾收集的,因为它们是从运行时实例创建的引用表中引用的,以便优化空间.
如果字符串文字池的大小超过那么,因为字符串文字池中的每个字符串都有引用,因此它不符合GC的条件.它是如何由JVM处理的?
And*_*y L 11
JavaRanch对实际代码示例进行了长时间的讨论.
一般输出如下:
您的问题的答案是:由于String常量而导致OutOfMemoryError的唯一方法是在编译时计算许多字符串文字的类.然后,您最终可以超过PermGen空间的最大大小.但是这会在您将类加载到内存中时发生(例如,启动应用程序,将项目部署到WebServer,动态加载新库等)
当不再需要字符串文字时,可以收集它们。通常,如果它们出现在类中,这不是问题,因为如果您尝试加载大量类,例如最大永久代,则可能会达到其他限制。
一般来说,开发人员足够聪明,不会过度使用字符串文字池,而是使用数据库或文件来加载大量数据(如果数据大小不小)。
如果您大量使用 String.intern() 来尝试优化系统空间,则可能会带来问题。String.intern() 不是免费的,如果向其中添加大量(数百万)字符串,它会变得越来越昂贵。如果这是一个性能问题,那么对于开发人员来说,它应该是相当明显的。
归档时间: |
|
查看次数: |
4487 次 |
最近记录: |