[英]Possible memory leak with StringBuilder?
我正在使用StringBuilder
创建File
对象,但也正在使用它来查看文件所在的目录是否存在:
StringBuilder sbFile = new StringBuilder();
sbFile.append("/home/logs/");
File oFile = new File(sbFile.toString());
if(!oFile.exists())
oFile.mkdir();
sbFile.append("MyLogFile.log");
oFile = new File(sbFile.toString());
但是我担心在字符串生成器的两个不同“版本”( /home/logs/
vs /home/logs/MyLogFile.log
)上重用相同的oFile
引用会造成内存泄漏。 如果是这样,我应该怎么写呢?
没有内存泄漏。 首次创建的File
实例将在不再使用时由JVM进行垃圾收集。
另一件事是您实际上不需要使用StringBuilder
。 File
类具有一个构造函数,该构造函数带有一个父级和一个文件名。 您的示例可能如下所示:
File parent = new File("/home/logs/");
if(!parent.exists())
parent.mkdir();
File file = new File(parent, "MyLogFile.log");
// TODO: do something with file...
另外,您可能对Java中的垃圾回收如何工作感兴趣。
您不用担心。 字符串在Java中是不可变的,不会给您带来内存泄漏(至少不是您使用它们的方式)。 每次调用sbFile.toString()
都会创建一个新的不可变String。
没有内存泄漏,垃圾回收器返回以重新使用旧的未使用对象的内存。
关于File oFile
您在代码中使用2个不同的对象。 您在此处创建的第一个对象:
File oFile = new File(sbFile.toString());
当您再次使用oFile引用并且旧对象在等待垃圾回收的任何地方均未引用时。
关于StringBuilder sbFile
无论何时使用它的toString()方法,都会创建一个新的不可变String对象(Java中的String对象始终是不可变的)。 因此,在第二个sbFile.toString()
调用中,创建了第二个String对象,垃圾回收器可以安全地删除第一个String对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.