提高 Java 代码性能的各种技巧
Java 6,7,8 中的 String.intern – 字符串池
这篇文章将要讨论 Java 6 中是如何实现 String.intern
方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
总结
-
由于 Java 6 中使用固定的内存大小(PermGen)因此不要使用
String.intern()
方法 -
Java7 和 8 在堆内存中实现字符串池。这以为这字符串池的内存限制等于应用程序的内存限制。
-
在 Java 7 和 8 中使用
-XX:StringTableSize
来设置字符串池 Map 的大小。它是固定的,因为它使用HashMap
实现。近似于你应用单独的字符串个数(你希望保留的)并且设置池的大小为最接近的质数并乘以 2 (减少碰撞的可能性)。它是的String.intern
可以使用相同(固定)的时间并且在每次插入时消耗更小的内存(同样的任务,使用javaWeakHashMap将消耗4-5倍的内存)。
-
在 Java 6 和 7(Java7u40以前) 中
-XX:StringTableSize
参数的值是 1009。Java7u40以后这个值调整为 60013 (Java 8 中使用相同的值)
-
如果你不确定字符串池的用量,参考:
-XX:+PrintStringTableStatistics
JVM参数,当你的应用挂掉时它告诉你字符串池的使用量信息。
宜分享,宜收藏,宜学习。
本文为头条号作者发布,不代表今日头条立场。