您的位置:首页 > 编程语言 > Java开发

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

2015-06-17 14:33 525 查看

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高级特性与最佳实践(高清完整版)》的第二章内容。如果有理解错误,请大神们指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string