垃圾回收

来源:互联网 发布:知乎 爆照贴 编辑:程序博客网 时间:2024/05/16 17:54

 JAVA使用垃圾回收器进行对象的内存空间回收,而且垃圾回收器是自动调用的,不需要用户的干预。一般情况下,用户只需要垃圾回收器就可以处理完所有对象的回收工作,但是在有些情况下,例如:用户需要把对象在创建过程中创建的图形擦除,打开的文件关闭,或者对象在创建过程中使用外部程序(如C++)创建了非JAVA对象(非JAVA对象不能用垃圾回收器自动回收)等等,则这些情况都需要用户使用另外的方法进行清除,JAVA中这个方法叫 finalize(),这个方法可以在类中定义,然后垃圾回收器在自动回收该类的对象前,会自动调用该类的finalize(),先进行其定义的特殊清除工作。

 在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。当你创建一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造器并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标记为释放状态。

 当垃圾回收器要释放一个对象的内存时,它首先调用该对象的finalize() 方法(如果该对象定义了此方法的话)。垃圾回收器以独立的低优先级的方式运行,所以只有当其他线程都挂起等待内存释放的情况出现时,它才开始释放对象的内存。(理论上,你还可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)

 在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。
其次,除非垃圾回收器认为你的Applet或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,有可能出现这样的情况:一个 Applet 给少量的对象分配了内存,但没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存程序就退出了。

 显然,如果你为某个对象定义了finalize() 方法,JVM可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。即使调用System.gc() 也可能不会起作用,因为它仅仅是给 JVM 的一个建议而不是命令,所以finalize()方法的作用也就不是那么明显。Java 1.1中有一个System.runFinalizersOnExit()方法部分地解决了这个问题。(不要将这个方法与 Java1.0中的System.runFinalizations()方法相混淆。)不象System.gc() 方法那样,System.runFinalizersOnExit()方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize()方法。
结论:你不应当依靠垃圾回收器或finalize() 来执行你的 Applet 和应用程序的资源清除工作。取而代之,你应当使用确定的方法来清除那些资源或创建一个try...finally 块(或类似的机制)来实现

原创粉丝点击