什么是资源泄漏?
What exactly are resource leaks?
我多次听到人们使用 "Resource leak" 这个词。我敢肯定这是一个全球现象,但为了这个答案的目的,我会坚持 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 实例中执行,在一个封闭的环境中,这些 "resource leaks" 究竟会对我造成什么伤害?是否有可能被其他恶意程序利用?
你举的例子是对的。从 OS 的角度思考,您已经预定义了可以创建的 file/sockets 句柄,也就是说一次可以打开这么多文件。现在如果你继续打开多个文件,你可能会超出可以打开的文件数。
虽然,它的 JVM 但 JVM 本身不能 运行 没有 OS 的帮助。文件 handler/descriptor 只是示例之一。
如果是内存,那么您不必担心,因为它会由 GC 自动处理,但 GC 不会处理资源。
类 实现 java.io.Closeable
(自 JDK 1.5)和 java.lang.AutoCloseable
(自 JDK 1.7)被认为代表外部资源,应该是当不再需要它们时,使用方法 close() 关闭它们。所有操作系统都对套接字数量有限制,文件 handles.etc。可以在特定时间打开。如果你不关闭资源,那么你就没有必要让它们保持打开状态,如果你继续打开越来越多的资源而不关闭它们,那么一段时间后操作系统将无法分配更多资源。
我多次听到人们使用 "Resource leak" 这个词。我敢肯定这是一个全球现象,但为了这个答案的目的,我会坚持 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 实例中执行,在一个封闭的环境中,这些 "resource leaks" 究竟会对我造成什么伤害?是否有可能被其他恶意程序利用?
你举的例子是对的。从 OS 的角度思考,您已经预定义了可以创建的 file/sockets 句柄,也就是说一次可以打开这么多文件。现在如果你继续打开多个文件,你可能会超出可以打开的文件数。
虽然,它的 JVM 但 JVM 本身不能 运行 没有 OS 的帮助。文件 handler/descriptor 只是示例之一。
如果是内存,那么您不必担心,因为它会由 GC 自动处理,但 GC 不会处理资源。
类 实现 java.io.Closeable
(自 JDK 1.5)和 java.lang.AutoCloseable
(自 JDK 1.7)被认为代表外部资源,应该是当不再需要它们时,使用方法 close() 关闭它们。所有操作系统都对套接字数量有限制,文件 handles.etc。可以在特定时间打开。如果你不关闭资源,那么你就没有必要让它们保持打开状态,如果你继续打开越来越多的资源而不关闭它们,那么一段时间后操作系统将无法分配更多资源。