【发布时间】:2012-09-29 08:46:52
【问题描述】:
由于 Java 的默认字符串实习受到了很多负面报道,我正在寻找替代方案。
你能推荐一个 API 来替代 Java 字符串实习吗?我的应用程序使用 Java 6。我的要求主要是通过实习避免重复字符串。
关于负面新闻:
- 字符串实习生是通过本机方法实现的。并且 C 实现使用一些 1k 条目的固定大小,并且对于大量字符串的扩展性非常差。
- Java 6 将实习字符串存储在 Perm gen 中。因此不是 GC'd 并可能导致 perm gen 错误。我知道这在 java 7 中已修复,但我无法升级到 java 7。
为什么我需要使用 intering?
- 我的应用程序是一个服务器应用程序,堆大小为 10-20G,用于不同的部署。
- 在分析期间,我们发现数十万个字符串是重复的,我们可以通过避免存储重复的字符串来显着提高内存使用率。
- 内存一直是我们的瓶颈,因此我们将其作为目标,而不是进行任何过早的优化。
【问题讨论】:
-
我的一部分尊重你发布的要求,但如果“坏消息”足以让你避免它们,那么我真的不得不问你是如何分析你的应用程序的(如果有的话)确定 Java 字符串不适合。
-
您是否注意到您的应用程序中存在与这些问题相关的问题?如果没有,我不会担心。
-
@Keppil 我的应用程序有数十万个重复的字符串。所以实习对我来说是必须的。
-
@pst 希望我已经回答了你的问题。我假设您指的是 Map 而不是 Set。我需要一些线程安全的东西,一旦不再引用它们就会对字符串进行 GC。类似并发弱哈希映射。
-
@ManojGumber stackoverflow.com/questions/8853515/… (impl with Map) , stackoverflow.com/questions/3972841/… (提到 Guava Interner)
标签: java string memory string-interning