java string pool 会溢出么

发布于 2022-08-26 19:45:49 字数 235 浏览 12 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

子栖 2022-09-02 19:45:49

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

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

内心旳酸楚 2022-09-02 19:45:49

首先,

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。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文