多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## [垃圾回收器](https://lingcoder.gitee.io/onjava8/#/book/06-Housekeeping?id=%e5%9e%83%e5%9c%be%e5%9b%9e%e6%94%b6%e5%99%a8) 程序员都了解初始化的重要性,但通常会忽略清理的重要性。毕竟,谁会去清理一个**int**呢?但是使用完一个对象就不管它并非总是安全的。Java 中有垃圾回收器回收无用对象占用的内存。但现在考虑一种特殊情况:你创建的对象不是通过**new**来分配内存的,而垃圾回收器只知道如何释放用**new**创建的对象的内存,所以它不知道如何回收不是**new**分配的内存。为了处理这种情况,Java 允许在类中定义一个名为`finalize()`的方法。 它的工作原理"假定"是这样的:当垃圾回收器准备回收对象的内存时,首先会调用其`finalize()`方法,并在下一轮的垃圾回收动作发生时,才会真正回收对象占用的内存。所以如果你打算使用`finalize()`,就能在垃圾回收时做一些重要的清理工作。`finalize()`是一个潜在的编程陷阱,因为一些程序员(尤其是 C++ 程序员)会一开始把它误认为是 C++ 中的析构函数(C++ 在销毁对象时会调用这个函数)。所以有必要明确区分一下:在 C++ 中,对象总是被销毁的(在一个 bug-free 的程序中),而在 Java 中,对象并非总是被垃圾回收,或者换句话说: 1. 对象可能不被垃圾回收。 2. 垃圾回收不等同于析构。 这意味着在你不再需要某个对象之前,如果必须执行某些动作,你得自己去做。Java 没有析构器或类似的概念,所以你必须得自己创建一个普通的方法完成这项清理工作。例如,对象在创建的过程中会将自己绘制到屏幕上。如果不是明确地从屏幕上将其擦除,它可能永远得不到清理。如果在`finalize()`方法中加入某种擦除功能,那么当垃圾回收发生时,`finalize()`方法被调用(不保证一定会发生),图像就会被擦除,要是"垃圾回收"没有发生,图像则仍会保留下来。 也许你会发现,只要程序没有濒临内存用完的那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,而垃圾回收器一直没有释放你创建的任何对象的内存,则当程序退出时,那些资源会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,那就不用支付这部分开销了。