http://lovestblog.cn/blog/2014/06/28/hsdb-string/
通过 HSDB 来了解 String 值的真身在哪里
最近通过 @RednaxelaFX 的一篇文章得知了 HSDB,并好好研究了一下用法,对学习 jvm 的人来说绝对是一个
利器,可以摆脱 GDB,直接图形化看内存结构布局,具体的用法我就不多说了,这篇文章介绍得很详细了,这次
写文章主要是想通过这一利器来分析下 String 的值在 java 里的内存情况,不同场景下的 String 的值到底是在内存
里的哪块区域,这里强调的是值,并不是对象,因为对象我们都知道是存在 heap 里的,我们看 java.lang.String
的源码会看到有一个 value 数组,这里才是真正的值,本文顺带也是 hsdb 用法的一个介绍,如此利器希望给大
家带来不一样的乐趣。
还是先看 demo
public class StringTest {
private String val1="a";
private static String val2=StringTest.class.getName()+"b";
public static void main(String args[]){
StringTest st=new StringTest();
String a="a";
String d="a";
String b=a+"b";
String c="a"+"b";
String e="ab";
System.out.println(a+b+c+d+e);
}
}
本文想从上面的例子得出哪些结论呢?
1. 实例变量 val1 和局部变量 a,d 是否指向同一个内存地址
2. 局部变量 b,c,e 是否指向同一个内存地址
3. 局部变量 b 的值是在哪里分配的,stack?heap?perm?
4. 字符常量”a”,”ab”分配在哪里?
5. 静态变量 val2 的值又是分配在哪里?
先看看我们通过 eclipse 调试能确定的结果,断点打在最后一行