繁体   English   中英

StringBuilder可能发生内存泄漏?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM