Java StringBuilder可能存在内存泄漏?

Java StringBuilder可能存在内存泄漏?,java,file-io,memory-leaks,Java,File Io,Memory Leaks,我正在使用StringBuilder创建文件对象,但也在使用它查看文件所在的目录是否存在: 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 F

我正在使用
StringBuilder
创建
文件
对象,但也在使用它查看文件所在的目录是否存在:

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
)上重用相同的
文件引用会造成内存泄漏。如果是这样的话,我该怎么写呢?

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

没有内存泄漏。第一次创建的
文件
实例在不再使用时将由JVM进行垃圾收集

另一件事是,您实际上不需要使用
StringBuilder
<代码>文件
类有一个构造函数,它接受父级和文件名。您的示例可以如下所示:

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

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

另外,您可能会感兴趣。

如果没有内存泄漏,垃圾收集器将返回旧的未使用对象的内存以供重用

对于文件的
文件
,您在代码中使用了两个不同的对象。在此处创建的第一个对象:

File oFile = new File(sbFile.toString());
当您再次使用文件引用时,旧对象在等待垃圾收集的任何位置都没有被引用


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

toString()
返回的字符串是否不是存储在
StringBuilder
中的字符串的副本,因此不会导致任何类型的悬空引用?--啊,根据Jonathan W.的说法,似乎确实如此。我的理解是不会的,一旦你在旧文件的基础上创建了一个“新文件”,旧文件将被发布,并可供GC拾取。