java string pool 会溢出么

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

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

阅读 5k
2 个回答

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

退一万步说,你很大量地使用这种字符串,那又能使用多少?你写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。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题