在我的程序代码中有很多线程。当我的程序开始和结束时,句柄的数量不会被释放。当程序第二次启动时,句柄数量增加。每次都会发生这种情况此外,程序的线程数也增加了。谁能告诉我如何释放手柄?因为我的程序中存在句柄泄漏的问题。
答案 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()是一个请求,而不是一个强制命令,因此它可能不会产生确切的预期数字。