问题描述
|
在我的程序代码中,有很多线程。当我的程序开始和结束时,句柄的数量不会释放。当程序第二次启动时,句柄数量增加。每次都会发生这种情况。程序的线程数也增加了。有人可以告诉我如何释放手柄吗?因为在我的程序中存在句柄泄漏的问题。
解决方法
您不会关闭正在使用这些句柄的流。每当您使用某种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()是一个请求,而不是强制命令,因此它可能不会产生确切的预期数字。