如何在java中释放句柄

时间:2011-05-24 11:46:39

标签: java

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

2 个答案:

答案 0 :(得分:5)

您没有关闭使用这些句柄的流。每次使用某种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(); }成语嵌入到编程肌肉记忆中是个好主意,因为总是想要处理这样的资源。这是防止泄漏的唯一可靠方法,应该在第一次编写代码时完成,而不是在以后追查错误时完成。

答案 1 :(得分:0)

除了Andrzej所说的: 检查您的自定义对象是否覆盖了finalize()方法。如果finalize方法抛出异常,那么该对象永远不会被垃圾收集。

确实需要检查静态集合的用法,通常静态集合很长。

可能你可以尝试使用软引用和弱引用,这样当下次垃圾收集发生时,它们引用的对象可能有资格进行垃圾收集。

再次注意:system.gc()是一个请求,而不是一个强制命令,因此它可能不会产生确切的预期数字。