如何在Java中释放句柄

问题描述

| 在我的程序代码中,有很多线程。当我的程序开始和结束时,句柄的数量不会释放。当程序第二次启动时,句柄数量增加。每次都会发生这种情况。程序的线程数也增加了。有人可以告诉我如何释放手柄吗?因为在我的程序中存在句柄泄漏的问题。     

解决方法

您不会关闭正在使用这些句柄的流。每当您使用某种I / O资源时,都需要确保其已关闭。传统上,这应该在
finally
块中完成,以确保无论发生什么都可以将其调用,例如:
final FileInputStream in = new FileInputStream(\"C:/test.txt\");
try {
    // Do whatever you want with the stream:
    //   - read from it directly
    //   - call other methods etc.
    // Just make sure you\'re really finished with it
    // by the end of this try block!
}
finally {
    in.close();
}
这同样适用于数据库连接,HTTP连接,各种URL资源-几乎所有使用
close()
方法的内容。 查看这些句柄的实际类型(文件/数据库/网络端口)和任何详细信息(例如文件名,远程主机等)将有助于您查找程序的哪些部分未正确关闭其资源。 将
try { ... } finally { foo.close(); }
习惯用法嵌入编程肌肉内存中是一个好主意,因为您一直想像这样对待资源。这是防止泄漏的唯一可靠方法,应该在第一次编写代码时执行,而不是在以后查找错误时执行。     ,除了Andrzej所说的: 检查您的自定义对象是否覆盖了finalize()方法。如果finalize方法抛出异常,则该对象将永远不会被垃圾回收。 检查是否确实需要使用静态集合,通常来说,静态集合的寿命很长。 也许您可以尝试使用软引用和弱引用,以便在下次发生垃圾收集时,它们引用的对象可能符合垃圾收集的条件。 再次注意:system.gc()是一个请求,而不是强制命令,因此它可能不会产生确切的预期数字。