什么是非内存资源?

2022-09-03 01:08:18

我正在阅读“有效的Java”。

在关于最终确定的讨论中,他说

C++析构函数还用于回收其他非内存资源。在Java中,try finally块通常用于此目的。

什么是非内存资源?

数据库连接是非内存资源吗?用于保存数据库连接的对象是否占用了一些内存?


答案 1

数据库连接、网络连接、文件句柄、互斥锁等。当你完成它时,需要释放的东西(不仅仅是垃圾回收)。

是的,这些对象通常占用一些内存,但关键的一点是,除了内存之外,它们还具有(可能是独占的)对某些资源的访问权限。


答案 2

数据库连接是非内存资源吗?

是的,这是最常见的例子之一。其他是文件句柄,本机GUI对象(例如Swing或AWT窗口)和套接字。

用于保存数据库连接的对象是否占用了一些内存?

是的,但关键是资源的非内存部分也需要释放,并且通常比对象使用的相对较小的内存量稀缺得多。通常,此类对象具有释放非内存资源的方法,但问题是此终结器仅在对对象进行垃圾回收时运行。finalize()

由于对象很小,因此可能有足够的可用堆内存,因此垃圾回收器很少运行。在垃圾回收器的运行之间,非内存资源不会释放,您可能会用完它们。

这甚至可能导致单个对象出现问题:例如,如果要通过打开文件,打开目标文件,复制数据然后删除原始文件在文件系统之间移动文件,则如果文件仍处于打开状态,则删除将失败 - 如果您仅将对输入流的引用设置为null并且不显式调用,则几乎可以肯定的是, 因为垃圾回收器不太可能在对象符合垃圾回收条件和调用之间恰到好处的点运行close()delete()


推荐