首页   快速返回

String.intern要点整理     所属分类 java
String.intern() 将字符串加入常量池 

String str1 = "abc";
String str2 = str1.intern();
System.out.println(str1==str2);

如果常量池中存在指定的字符串,直接返回常量池中相应字符串的引用,否则在常量池中复制一份该字符串,并将其引用返回 

Java 6 中常量池位于PremGen区,大小受限,不建议使用String.intern()
java.lang.OutOfMemoryError: PermGen space

Java 7 将常量池移到了堆区,大小可控,谨慎使用;
字符串缓存,需要严格控制 缓存条目数量


public native String intern();
String.intern() Native方法,底层调用C++的 StringTable::intern

-XX:StringTableSize=N
 
参数设置过小会导致不断的rehash,消耗CPU资源

StringTableSize默认大小
jdk6 1009
jdk7 60013
jdk8 60013

jdk7 2个主要变化
将String常量池 从 Perm 区移到  Heap区
调用String#intern 方法时,如果存在堆中的对象,会直接保存对象的引用,而不会重新创建对象。





fastjson 中对所有的  key 使用了 intern 方法,缓存到字符串常量池中

fastjson 1.1.24版本对大量key的场景做了优化。超过最大缓存大小后,不再使用 常量池
public static final int MAX_SIZE           = 1024;
if (size >= MAX_SIZE) {
    return new String(buffer, offset, len);
}

上一篇     下一篇
fastjson使用技巧

java获取当前jvm进程id

system.gc要点整理

/proc/PID/status进程信息说明

java中的非阻塞IO和异步IO

NIO JMX BufferPool内存监控