java--finalize()的学习

来源:互联网 发布:金蝶软件在线服务中心 编辑:程序博客网 时间:2024/05/17 20:26

</pre>finalize()——“特殊”垃圾回收器<pre name="code" class="java">

       finalize()用来释放非new对象的内存。它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正的回收对象占用的内存。

注意:finalize()不是c++中的析构函数,在c++中,对象一定会被销毁(如果程序没有缺陷的话);而在java中的对象却不一定总是被垃圾回收。

       Java中没有提供“析构函数”或相似的概念,所以要做类似的清理动作,需要自己手动创建一个执行清理工作的普通方法。

finalize()的真正的用途:

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

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

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

4.如果java虚拟机(JVM)没有面临内存耗尽的情况,他是不会浪费时间去执行垃圾回收来恢复内存的。

5.finalize()不一定会发生,所以必须创建其他的“清理”方法,并调用。


<span style="font-size:18px;">package finalizetest;class Book{boolean checkedOut = false;Book( boolean checkOut){checkedOut = checkOut;}void checkIn(){checkedOut = false;}protected void finalize(){if(checkedOut)System.out.println("Error:cheched out");try {super.finalize();System.out.println("use finalize().");} catch (Throwable e) {//抛出异常// TODO Auto-generated catch blocke.printStackTrace();}}}public class finalizetest {  public static void main(String [] args){  Book story = new Book(true);  story.checkIn();  new Book(true);  System.gc();//提交回收申请  }}</span>

<span style="font-size:18px;">//输出Error:cheched outuse finalize()</span>
System.gc()//只是提交申请,但实际上finalize()执不执行,什么时候执行都是未知。
system.gc)()提交申请之后执行finalize()方法,并且输出两个句子,由于第二个创建的对象没有checkin,所以它的空间也没有被释放,直到程序结束的时候变成无引用的对象。那么为什么没有输出,我可以理解为因为程序结束了,所以输不出来吗?

每当程序结束的时候,垃圾回收站都会默默的出来收拾残局,而system.gc()是申请调用finalize()方法,这个时候,被我们重载过的方法就会被使用并输出语句。

<span style="font-size:18px;">public class FinalizationDemo {public static void main(String[] args) {Cake c1 = new Cake(1);Cake c2 = new Cake(2);Cake c3 = new Cake(3);c2 = c3 = null;//回收System.gc(); }}class Cake extends Object {private int id;public Cake(int id) {this.id = id;System.out.println("Cake Object " + id + "is created");}protected void finalize() throws java.lang.Throwable {super.finalize();System.out.println("Cake Object " + id + "is disposed");}}</span>


<span style="font-size:18px;">//输出C:\1>java FinalizationDemoCake Object 1is createdCake Object 2is createdCake Object 3is createdCake Object 3is disposedCake Object 2is disposed</span>

2,3的销毁可以看出finalize()无法确切地保证垃圾回收器何时调用该方法,也无法保证调用不同对象的方法的顺序。


0 0
原创粉丝点击