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

本文详细解析了 Java String 类中静态常量、常量池及引用对象在 JVM 中的存储机制,通过具体代码实例,探讨了在 Full GC 发生后 Heap 空间内字符数的保留情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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高级特性与最佳实践(高清完整版)》的第二章内容。如果有理解错误,请大神们指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值