java - 现实生活中,在 Java 中使用 String.intern() 的实际示例?

标签 java string permgen string-interning

我见过许多描述 String intern()'ing 工作原理的原始示例,但我还没有看到可以从中受益的真实用例。

我能想到的唯一情况是拥有一个接收大量请求的 Web 服务,由于严格的模式,每个请求在性质上都非常相似。在这种情况下,通过对请求字段名称进行 intern() 处理,可以显着减少内存消耗。

谁能提供一个在生产环境中使用 intern() 并取得巨大成功的例子?也许是流行的开源产品中的一个例子?

编辑:我指的是手动实习,而不是字符串文字等的保证实习。

最佳答案

如果您的 N 字符串只能采用 K 不同的值,其中 N 远远超过 K,则实习会非常有益。现在,您不再将 N 字符串存储在内存中,而是最多存储 K

例如,您可能有一个由 5 位数字组成的 ID 类型。因此,只能有 10^5 个不同的值。假设您现在正在解析一个包含许多对 ID 值的引用/交叉引用的大型文档。假设该文档总共有 10^9 个引用(显然某些引用在文档的其他部分重复)。

所以 N = 10^9K = 10^5 在这种情况下。如果您没有对字符串进行实习,您将在内存中存储 10^9 字符串,其中许多字符串是 equals (通过 Pigeonhole Principle )。如果您 intern() 您在解析文档时获得的 ID 字符串,并且您不会保留对从文档中读取的非实习字符串的任何引用(所以它们可以被垃圾收集),那么您将永远不需要在内存中存储超过 10^5 个字符串。

关于java - 现实生活中,在 Java 中使用 String.intern() 的实际示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510425/

相关文章:

java - 重装系统后"The specified Tomcat installation directory does not exist"

java - Struts2 PermGen 内存不足错误

java - Tomcat 7 PermGen Space 或无法创建 JVM

java - java中的构造函数重构为setter

java - 如何在Java中有效地删除XML字符串中的直接标签

c - 我该如何解释这个声明?

android - Toast onItemClickListener 使用字符串作为消息?

php - 按逗号和合并间隔将排序的数字数组内爆为字符串

java - Maven 构建中的 "java.lang.OutOfMemoryError: PermGen space"

java - 如何检查复杂对象的自定义相等性?