目录
String deduplication
字符串去重是从Java 8 update 20开始添加的特性。当G1收集器开始minor GC时,未被处理的字符串会通过hash值和其中的char[],查找是否有相同的字符串,如果找到,则此字符串中的char[]替换成找到的字符串中的char[],被替换掉的char[]将被回收。
-XX:+UseG1GC -XX:+UseStringDeduplication 这两个JVM选项同时使用才可以打开此特性。此参数为全局参数,将会影响所有字符串,并会增加CPU开销。
-XX:StringDeduplicationAgeThreshold=3 3为默认值。只有字符串在三次minor GC后还存活时,才会做去重。
-XX:+PrintStringDeduplicationStatistics 查看统计信息。
String.intern
字符串驻留是从Java 6开始添加的特性。会将字符串放入字符串池中。
从Java 6开始,字符串池放在PermGen中。在Java6u30前此值为一个常量1009。从Java6u30开始,可通过-XX:StringTableSize进行配置。
从Java 7开始,字符串池放在椎中。从Java7u40开始默认值变为60013。
-XX:StringTableSize 设置字符串池的大小,值最好取素数。
-XX:+PrintStringTableStatistics 查看统计信息。
参考文档
String.intern in Java 6, 7 and 8 – string pooling
String deduplication feature (from Java 8 update 20)
JEP 192: String Deduplication in G1
Save Memory by Using String Intern in Java