finalize()方法:一旦gc准备释放对象占用的存储空间,将首先调用finalize()方法,并在下一次垃圾回收动作发生时才会真正回收内存。可在此进行重要的清理操作。gc只能释放那些经由new分配的内存,对其他形式获得的内存无法释放。finalize()方法不一定会被调用,所以不能作为通用的清理方法。
它不是析构函数,C++中对象一定会被销毁(必须用到析构函数),而java 对象却并非总是被垃圾回收。所以:
(1)。对象可能不被垃圾回收。
(2)。垃圾回收并不等于“析构”。
(3)。垃圾回收只与内存有关。
垃圾回收机制处理new出来的对象,finalize()处理其他方式为对象分配的存储空间,比如“本地方法”,是一种在Java中调用非Java代码的方式,分配内存时采用了类似C的方法。
finalize()方法用来发现对象中更没有被适当清理的部分。
class Book{ boolean checkOut = false; public Book(boolean checkOut) { this.checkOut = checkOut; } void checkIn(){ checkOut = false; } protected void finalize() throws Throwable { if (checkOut){ System.out.println("Error:checked out"); super.finalize(); } } public static void terminationCondition(){ Book novel = new Book(true); novel.checkIn();//正常回收 new Book(true); System.gc();//强制进行终结动作 }
//执行结果: //Error:checked out//finalize()用来验证终结条件:所有Book对象被回收前都应被签入(check in)
}
垃圾回收器只有在程序存储空间快用完时才会调用。否则程序退出后资源自动交付操作系统。可以用System.gc()通知系统回收,但是不一定立即执行。