编程思想第五章(初始化与清理-finalize理解)

  对于《java编程思想》的第5章:初始化与清理中,介绍了一下垃圾清理相关的知识点,我们都知道清理不用的内存对于一个程序是至关重要的,java不同与C与C++的语言,我们不需要单独去回收一些内存的占用,因为java会去帮我们进行一些内存的清理。在编程思想的第五章,第5.5小结(清理:终结处理和垃圾回收)有这样的话语:

  java有垃圾回收器负责回收无用对象占据的内存资源,但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块"特殊"内存。为了应对这种情况,java允许在类中定义一个名为finalize()的方法,他的工作远离“假定”是这样的:一旦垃圾回收准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。

  有这样一个潜在的编程陷阱,对于C++程序员来说,会把finalize()当作C++的析构函数(C++中销毁对西那个必须要用到这个函数),但是java对象却并非总是被垃圾回收。或者可以换句话说:

1.对象那个可能不被垃圾回收

2.垃圾回收并不等于"析构"

finalize()的用途何在

  可能对于我们来说,我们已经不明白了finalize()不作为通用的清理方法,那么,finalize()的真正用途是什么呢?我们只需要记住这第三点:

3.垃圾回收之与内存有关

  垃圾回收器会释放对象占有的内存,那么就将finalize()的作用只限制到一种特殊的情况,即通过某种创建对象那个方式以外的方式为对象分配存储空间【注释1】,对这种形式的对象进行释放。

  其实对于我们来说,或者我们自己已经明白了不要过多的使用finalize()的道理,对,它确实不是进行普通的清理工作的合适场所,我们对它只需要理解即可。所以我们的垃圾清理不能指望finalize(),我们必须有其他的清理方法

【注释1】:之所以要有finalize(),是由于在分配内存时可能采用了类似C语言的做法,而非java中的通常做法,这种情况主要发生在“本地方法”的情况下,本地方法目前只支持C和C++,但他们可以调用其他语言写的代码,所以实际上可以调用任何代码,在非java中,也许会调用C的malloc()函数系列来分配内存空间,而且除非调用free()函数,否则存储空间将得不到释放,从而造成内存泄漏,当然,free()是C和C++中的函数,所以需要在finalize()中使用本地方法调用给你它。

发布了99 篇原创文章 · 获赞 72 · 访问量 54万+

猜你喜欢

转载自blog.csdn.net/wj123446/article/details/87748000