StringBuilder可能出现内存泄漏?

时间:2012-06-04 20:26:10

标签: java file-io memory-leaks

我使用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());

但我担心在字符串构建器(oFile vs /home/logs/)的两个不同“版本”上重用相同的/home/logs/MyLogFile.log引用会产生内存泄漏。如果是这样,我该怎么写这个呢?

3 个答案:

答案 0 :(得分:6)

没有内存泄漏。第一次创建的File实例将在JVM不再使用时被垃圾收集。

另一件事是你真的不需要使用StringBuilderFile类有一个构造函数,它接受和文件名。您的示例可能如下所示:

File parent = new File("/home/logs/");
if(!parent.exists())
    parent.mkdir();

File file = new File(parent, "MyLogFile.log");
// TODO: do something with file...

另外,您可能对how garbage collection works in Java感兴趣。

答案 1 :(得分:3)

你没有什么可担心的。字符串在Java中是不可变的,并且不会给你内存泄漏(至少不是你使用它们的方式)。 sbFile.toString()每次调用它时都会创建一个新的不可变String。

答案 2 :(得分:0)

没有内存泄漏,垃圾收集器返回旧的未使用对象的重用内存。

关于File oFile,您在代码中使用了2个不同的对象。您在此处创建的第一个对象:

File oFile = new File(sbFile.toString());

再次使用oFile引用时,旧对象在等待垃圾回收的任何地方都没有被引用。

关于StringBuilder sbFile,只要你使用它的toString()方法,就会创建一个新的不可变String对象(Java中的String对象总是不可变的)。因此,在第二个sbFile.toString()调用中,第二个String对象被创建,垃圾收集器可以安全地删除第一个String对象。