我的系统不断耗尽磁盘空间,因为垃圾收集器没有足够快地释放持有文件句柄的对象。 (文件一直在创建和删除,但由于进程仍然有一个打开的文件句柄,操作系统将其保留在磁盘上)。
对象是共享的,所以一个简单的 try { ... } finally { close();
不行。
在我看来,我最好的选择是在对象上实现引用计数,并在引用计数变为 0 时关闭文件句柄。但是,我不愿意自己全部实现,正如我怀疑的那样是关于并发的微妙问题。
遗憾的是,谷歌搜索“java 中的引用计数”没有带来任何有用的结果。所以我的问题是:是否有任何资源(文章、示例代码、库)可以帮助实现引用计数?
最佳答案
不要依赖垃圾收集器。它有意设计为不可靠。
如果“共享”意味着您在代码中的多个位置使用它,所以您不能直接关闭它,我建议您更改代码以拥有一个中央文件池,您可以在其中“ check out ”一个文件句柄在本地代码中使用。然后 close() 过程将文件句柄返回到池中。跟踪您的句柄,当给定文件的所有句柄都返回到池中时,您将永久关闭该文件。
关于java - Java 中的引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3952930/