什么是非内存资源?

Vin*_*C M 17 java effective-java

我正在阅读" Effective Java ".

他说,在关于敲定的讨论中

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

什么是非内存资源?

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

Gra*_*and 22

数据库连接,网络连接,文件句柄,互斥等一些东西,需要被释放(不只是垃圾回收),当你完成它.

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

  • 是的,主要的是这些资源与记忆一样重要,甚至更重要. (2认同)

Mic*_*rdt 5

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

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

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

是的,但重点是资源的非内存部分也需要释放,并且通常比对象使用的相对少量的内存更稀缺.通常,此类对象具有finalize()释放非内存资源的方法,但问题是此终结器仅在对象被垃圾回收时运行.

由于对象很小,可能有大量可用的堆内存,因此垃圾收集器很少运行.在垃圾收集器的两次运行之间,非内存资源不会被释放,您可能会耗尽它们.

这甚至可能导致只有一个对象出现问题:例如,如果要通过打开文件系统,打开目标文件,复制数据然后删除原始文件来在文件系统之间移动文件,如果文件是仍然打开 - 几乎可以肯定的是,如果你只将输入流的引用设置为null并且不close()显式调用,因为垃圾收集器不太可能在对象变得合格之间的正确点处运行垃圾收集和调用delete()