一、Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。(1).对象不一定会被回收。(2).垃圾回收不是析构函数。(3).垃圾回收只与内存有关。(4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。二、垃圾回收器:1、在Java中,当创建一个对象时,Java虚拟机(JVM)为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM通过垃圾回收器将该对象标记为释放状态。2、当垃圾回收器将要释放一个对象的内存时,调用该对象的finalize()方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其线程挂起等待该内存释放的情况出现时,才开始运行释放对象的内存。(事实上,可以调用System.gc()方法强制垃圾回收器来释放这些对象的内存。)3、在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在Applet或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。三、finalize()方法的优缺点:1、根据Java文档,finalize()是一个用于释放非Java资源的方法。但是,JVM有很大的可能不调用对象的finalize()方法,因此很难证明使用该方法释放资源是有效的。2、Java1.1通过提供一个System.runFinalizersOnExit()方法部分地解决了这个问题。(不要将这个方法与Java1.0中的System.runFinalizations()方法相混淆。)不象System.gc()方法那样,System.runFinalizersOnExit()方法总结:并不立即试图启动垃圾回收器。而是当应用程序或Applet退出时,调用每个对象的finalize()方法。
阅读全文 >