java String类有关静态变量,常量池,引用对象的问题

java String类有关静态常量,常量池,引用对象的问题

今天看到一个面试题,这让我对String类和jvm运行数据有新的了解,题目如下:

static String str0="0123456789";
static String str1="0123456789";
String str2=str1.substring(5);
String str3=new String(str2);
String str4=new String(str3.toCharArray());
str0=null;

假定str0,…,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()
5
10
15
20

一开始我以为是20,但后来查了一些资料后觉得应该是10,不知道对不对,但分析如下:
1.
static String str0=”0123456789”;
static String str1=”0123456789”;
这两行代码是 静态变量,静态变量在运行时会存在于方法区(非堆),所以heap空间为0
2.
String str2=str1.substring(5);
这行代码会将字符中放入字符池中也就是常量池,运行时常量池是方法区的一部分。
3.
String str3=new String(str2);
这行代码是new 了一个新的对象,肯定在运行时是放在堆中的。就算赋的值是另一String.所以空间应该为5.
4.
String str4=new String(str3.toCharArray());
这也是啦。+5
5.
str0=null;
这行没什么说的了,是把静态变量赋值为null,也没有放在堆中啦。

得出这个结果,我首先是查了《深入理解Java虚拟机 JVM高级特性与最佳实践(高清完整版)》的第二章内容。如果有理解错误,请大神们指出。

你可能感兴趣的:(java虚拟机jvm,java基础)