Java的GC与finalize函数

来源:互联网 发布:王菲演唱会网络直播 编辑:程序博客网 时间:2024/05/15 02:14

1.什么是java的GC:
GC是垃圾回收的意思,内存处理是程序员最容易出现问题的地方,忘记或者是错误的内存回收会导致系统的不稳定甚至是崩溃。java提供的内存回收机制能够监测对象(使用new得到的)是否超过了作用域,一旦超过了就会自动回收内存,但是java没有提供显式的操作方法来主动的释放内存。

一个对象从new开始就要受到GC的监视,GC监视着这个对象的地址、大小以及使用情况。通常GC采用有向图的方式来监控堆中的对象,通过这种方式来判断那些对象是“可达的”,那些是“不可达的”,一旦对象是不可达的,那么GC就有责任去回收这些对象。程序员可以通过System.gc()来通知GC运行,但是GC不一会执行。

2.finalize函数:

    对于一些对象,不是通过new的方式获得,系统会分配出一块特殊的内存来存放这些对象,但是Java的GC机制只会去监视new出来的对象,这个时候就要用到finalize函数了。finalize函数是一个Object类的方法,修饰符为protected,但是finalize函数没有自动实现链式调用,必须要我们手动实现,因此finalize函数的最后一句通常是super.finalize()。通过这种自下而上的方式实现finalize函数的调用,也就是先释放自己的资源再释放父类的资源。根据java的语法规范,JVN保证调用finalize函数之前,对象是“不可达的”,但是JVM不保证这个函数一定会被调用,而且finalize函数最多只能运行一次。    很多Java初学者会认为这个方法类似与C++中的析构函数,将很多对象、资源的释放都放在这一函数里面。其实,这不是一种很好的方式。原因有三,其一,GC为了能够支持finalize函数,要对覆盖这个函数的对象作很多附加的工作。其二,在finalize运行完成之后,该对象可能变成可达的,GC还要再检查一次该对象是否是可达的。因此,使用 finalize会降低GC的运行性能。其三,由于GC调用finalize的时间是不确定的,因此通过这种方式释放资源也是不确定的。      通常,finalize用于一些不容易控制、并且非常重要资源的释放,例如一些I/O的操作,数据的连接。这些资源的释放对整个应用程序是非常关键的。在这种情况下,程序员应该以通过程序本身管理(包括释放)这些资源为主,以finalize函数释放资源方式为辅,形成一种双保险的管理机制,而不应该仅仅依靠finalize来释放资源。 
1 0