java垃圾回收机制及finalize()方法

java垃圾回收机制及finalize()方法

程序员都了解初始化的重要性,但常常会忘记同样也重要的清理工作,在使用完一个对象以后就“弃之不顾”的做法并非总是安全的。

垃圾回收器

当然,java与C、C++不同,它有垃圾回收器负责回收无用对象占据的内存资源,但是也有特殊情况,假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知怎么去释放这块内存。为了应对这种情况,java允许在类中定义一个名为finalize()的方法。

finalize()什么时候被调用?

一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以,finalize()方法能在垃圾回收时刻做一些重要的清理工作。

finalize的用途

  • 由于java中一切皆对象,上面提到的特殊情况是怎么回事呢?

    事实上,出现上面那种情况,是由于在分配内存的时候可能采用了类似C语言的做法,而非java中的通常做法,这种情况通常发生在使用“本地方法”的情况下。

  • 本地方法是什么?

    本地方法是一种在java中调用非java代码的方式。本地方法目前只支持C和C++,但它们可以调用其他语言写的代码,所以实际上java可以调用任何代码。在非java代码中,可能会调用C的malloc()函数来分配内存,而且除非调用free()函数,否则存储空间得不到是否,从而造成内存泄漏。

  • finalize中如何释放本地方法分配的内存空间

    由于free()是C和C++中的函数,所以需要在finalize方法中用本地方法free()函数去释放。

总结

通过上面的描述,相信读者已经明白finalize()方法不是进行普通清理工作的场所。那普通的清理工作应该在哪里执行呢,下次讨论咯。更多文章请看:woshisomeone.github.io.

注: 以上大部分内容来源与《java编程思想第四版》

你可能感兴趣的:(java垃圾回收机制及finalize()方法)