什么是资源泄漏?

时间:2015-01-04 15:44:39

标签: java resources

我听过很多次使用“资源泄漏”这个词。我确信这是一个全球现象,但为了这个答案的目的,我将坚持使用Java。以下面的代码为例:

public void append(String text) throws IOException
{
    BufferedWriter buffWriter = new BufferedWriter(new FileWriter("tf2rocks.imnotkidding", true));
    buffWriter.write(event);
    buffWriter.close();
}

在上面的代码段中,存在资源泄漏,好像IOException抛出了write()close()永远不会被调用。

现在我的问题是:资源泄漏究竟是什么?它们怎么会对我造成伤害?

如果每个java程序都在它自己的JVM实例中执行,那么在封闭的环境中,这些“资源泄漏”究竟会对我造成什么伤害?其他恶意程序是否可以利用此功能?

2 个答案:

答案 0 :(得分:2)

实现java.io.Closeable(自JDK 1.5以来)和java.lang.AutoCloseable(自JDK 1.7以来)的类被认为代表外部资源,当不再需要时,应使用close()方法关闭它们。所有操作系统都对套接字数量,文件句柄等有限制。可以在特定时间打开。如果你没有关闭资源,那么就没有必要保持它们是开放的,如果你继续打开越来越多的资源而不关闭它们,那么一段时间后操作系统将无法分配更多的资源。

答案 1 :(得分:0)

你的榜样是对的。从操作系统的角度来看,您可以创建预定义的文件/套接字句柄,即可以一次打开这么多文件。现在,如果您继续打开多个文件,则可能会打开多个可以打开的文件。

所以尽管如此,如果没有操作系统的帮助,它的JVM只能运行JVM。文件处理程序/描述符只是其中一个示例。

如果是内存,那么您不必担心,因为它会自动由GC处理,但GC不会处理资源。