String.intern要点整理
所属分类 java
浏览量 1542
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内存监控