1 问题
所负责服务需要保存大量字符串,通过写入大量数据,发现元空间持续变大,于是想到之前每位研发的的建议,使用intern方法来优化字符串存储,于是做了如下的测试。
2 测试intern demo
public static class Demo {
String value;
String key;
}
@Test
public void testForStringIntern() throws Exception {
Demo demo1 = new Demo();
//来自堆
demo1.value = new String("abc");
Demo demo2 = new Demo();
//来自常量池/元空间
demo2.value = demo1.value.intern();
Demo demo3 = new Demo();
//来自常量池/元空间
demo3.value = new String("abc").intern();
Demo demo4 = new Demo();
//来自常量池/元空间
demo4.value = "abc";
//来自堆
Demo demo5 = new Demo();
demo5.value = new String("abc");
System.out.println("demo1.value==demo2.value -> " + (demo1.value == demo2.value));
System.out.println("demo1.value==demo3.value -> " + (demo1.value == demo3.value));
System.out.println("demo1.value==demo4.value -> " + (demo1.value == demo4.value));
System.out.println("demo1.value==demo5.value -> " + (demo1.value == demo5.value));
System.out.println("demo2.value==demo3.value -> " + (demo2.value == demo3.value));
System.out.println("demo2.value==demo4.value -> " + (demo2.value == demo4.value));
System.out.println("demo3.value==demo4.value -> " + (demo3.value == demo4.value));
System.out.println("demo2.value==demo5.value -> " + (demo2.value == demo5.value));
}
3 官方 intern方法解释
我们通过google翻译,看看官方对于intern方法的解释:
4 总结说明
通过个人单元测试尝试和官方说明可知:
- intern操作会将字符串与元空间关联,如果元空间包含该字符串,则直接引用元空间引用,不在占用额外存储空间,如果元空间没有数据,则会创建一个新的实例。
- 通常我们接收rest请求、md5摘要等操作产生的字符串,如果他们后续需要持久化,而且大概率会与许多实例维护相同引用,可以通过intern操作,提高存储效率,否则如无特别必要不需要此类操作。