代码改变世界

C\C++ 程序员从零开始学习Android - 个人学习笔记(七) - java基础 - 类和对象的清除(待续)

2012-02-02 12:07  CreateLight  阅读(568)  评论(0)    收藏  举报

1,局部变量的清除

  方法内的局部变量,在栈上进行内存分配,当离开局部变量所位于的作用域块后,栈会自动回卷,清除所有此类型的变量。

2,对象的清除

  和C++不同,java没有提供析构函数。原因如下:

   a, C++中的对象可以在栈上分配空间,当离开所出作用域时,清除栈对象,此时会调用对象的析构函数;而java中所有对象都在堆上分配空间,没有栈对象。

   b,java有垃圾回收机制,所有对象会(在某个时刻)自动进行内存回收,因此不需要显式的在析构函数中回收内存。

  尽管如此,java的这些机制并不能完全替代C++析构函数所表现出来的语义和作用。

  java提供了finalize方法,垃圾回收器一旦决定了要对某个对象进行回收,会先调用这个对象的finalize方法,然后在下一次垃圾回收中才会真正的回收对象的内存。虚拟机最多只会调用finalize一次,如果某个对象不被引用,垃圾收集器对此执行了一次finalize,在下次回收其内存之前,若这个对象又复活了(再次被引用),然后又不被引用,垃圾收集器不会对其进行第二次finalize。finalize抛出的所有异常都会被忽略。

  finalize不能用来替代析构函数,其合法的用途应该是在使用本地(native)方法时,如果使用了new以外的内存分配方式(比如C的malloc),那么就需要在某个地方调用相应的内存释放函数(C的free),这个释放操作即可在finalize中进行。

  垃圾回收(待续)。

3,类的清除

  类被加载后,会占用方法区的内存空间,当类不再被需要时,虚拟机能够可选地卸载类,释放其占用的空间,这可称为类的垃圾回收(类似于对象的垃圾回收)。

  当一个类不再被引用时,这个类就称为不可触及的,从而可以被卸载。

  使用引导类加载器加载的类(java核心类)永远是可触及的,永远不会被卸载。只有用户自定义的类加载器加载的类型才可被卸载。

  类什么时候可触及(待续)。