字符串加载时,延迟特性
package design.wlb.studyjava.demo.restudy.c4jvm专题.chapter02.c31StringTable_字符串延迟加载;
/**
* 演示字符串字面量也是【延迟】成为对象的。
*/
public class Client {
public static void main(String[] args) {
int x = args.length;
System.out.println(x); // 字符串个数
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
System.out.println("5");
System.out.println("6");
System.out.println("7");
System.out.println("8");
System.out.println("9");
System.out.println("10");
System.out.println("1");
System.out.println("2");
System.out.println("3");
System.out.println("4");
System.out.println("5");
System.out.println("6");
System.out.println("7");
System.out.println("8");
System.out.println("9");
System.out.println("10");
}
}
这个特性,我们使用idea中debug里面memory功能来进行调试查看。
当走到图上断点1的位置时,此时java.lang.String类型的对象有3290个。 当执行完System.out.println("1");
此时java.lang.String类型的对象有3291个。 再往下走一行。当执行完System.out.println("2");
此时java.lang.String类型的对象有3292个。 这次我们直接到断点2的位置去。
此时java.lang.String类型的对象直接增加了7个,变为了3299个。我们把最后一个也跑一下
此时java.lang.String类型的对象直接增加了1个,变为了3300个。
下面还有10个,我们将其跑完,先再跑一下System.out.println("1");
此时String在内存中的对象,没有增加了。
再跑一下System.out.println("2");
此时String在内存中的对象,也没有增加了。
我们走完
当走到 System.out.println("10"); 时,内存中的对象,也没有增加了
以上说明了几点内容呢?
1.常量字符串被引用时,它是缓加载的,遇到了才会加载。
2.由前面的知识我们可以知道,它被加载到了串池里面那个堆里。
3.后续字符串被引用是,没有重新创建对象放入串池中,而直接从串池中去的。
好,这一篇就讲到这里。