java string pool 会溢出么
我看到代码中有很多的new String();我想把他们改成“”,这种方式做初始化。 但我查了一些资料,是说会string pool是垃圾不回收的。比如: String a = "abc"; String b = "def"; a = b; // "abc"就是没有引用的字符串了被留在string pool中,就是内存泄露了。
那我的问题是,如果这种情况多了,是不是string pool也会溢出,对与程序会怎么样。我们是安卓程序。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
内存泄漏是一段代码运行的时候产生了一块没有指针指向的内存,这段代码在重复执行的时候导致内存占用不断增加的情况。这种字符串常量不释放不算是内存泄漏,这个不是运行时动态申请的空间,也不需要释放,即使不释放也不会导致内存占用地持续增加。
退一万步说,你很大量地使用这种字符串,那又能使用多少?你写100M的源代码已经很牛逼了吧?这样最多也不就是占用100M的内存?
首先,
第二种写法并不能避免在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。