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高级特性与最佳实践(高清完整版)》的第二章内容。如果有理解错误,请大神们指出。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- JavaScript中的object转换成number或string规则介绍
- javascript String 对象
- JavaScript中number转换成string介绍