android - java string pool 会溢出么
PHPz
PHPz 2017-04-17 11:14:21
[Java讨论组]

我看到代码中有很多的new String();我想把他们改成“”,这种方式做初始化。 但我查了一些资料,是说会string pool是垃圾不回收的。比如: String a = "abc"; String b = "def"; a = b; // "abc"就是没有引用的字符串了被留在string pool中,就是内存泄露了。

那我的问题是,如果这种情况多了,是不是string pool也会溢出,对与程序会怎么样。我们是安卓程序。

PHPz
PHPz

学习是最好的投资!

全部回复(2)
ringa_lee

内存泄漏是一段代码运行的时候产生了一块没有指针指向的内存,这段代码在重复执行的时候导致内存占用不断增加的情况。这种字符串常量不释放不算是内存泄漏,这个不是运行时动态申请的空间,也不需要释放,即使不释放也不会导致内存占用地持续增加。

退一万步说,你很大量地使用这种字符串,那又能使用多少?你写100M的源代码已经很牛逼了吧?这样最多也不就是占用100M的内存?

黄舟

首先,

String a = "a";

String b = new String("b");

第二种写法并不能避免在perm gen创造"b"本身,它比第一种写法增加了heap中的一份拷贝。

其次,code和string literal带来的perm gen增长是可以忽略不计的,最多需要考虑的是动态加载了太多的class(比如通过mockito等cglib生成的)。

另外,如果你使用Java 6而不是7或者8,过度调用String.intern会导致perm gen出现OOM错误。

关于a和b两种写法,绝大多数情况下都应该用a,除非刻意消耗heap内存或者确切需要reference comparison的时候才应该用b。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号