垃圾回收器负责回收全部无任何引用对象的内存空间。 java
注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象自己。 jvm
1. System.gc(); Runtime.getRuntime().gc() 这两种方法用于显示通知JVM能够进行一次垃圾回收,但垃圾回收机制具体在什么时间运行是没法预知的。 函数
2.finalize() 方法 释放对象所占用的相关资源。 spa
当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize()方法。若是在程序终止以前垃圾回收器始终没有执行垃圾回收操做,那么垃圾回收器将始终不会调用无用对象的finalize()方法。由于finalize()只有在垃圾回收器工做的时候才会被调用,也就是说,经过它进行资源释放并不能确保立刻被释放,甚至可能根本不会被释放(由于垃圾回收器可能不会工做)。程序即便显式调用System.gc()或Runtime.gc()方法,也不能保证垃圾回收操做必定执行,所以不能保证无用对象的finalize()方法必定被调用。 对象
关于finalize()方法: 内存
java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 资源
(1).对象不必定会被回收。
(2).垃圾回收不是析构函数。
(3).垃圾回收只与内存有关。
(4).垃圾回收和finalize()都是靠不住的,只要JVM尚未快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。 作用域
垃圾收集器在进行垃圾收集的时候会自动呼叫对象的finalize方法,用来进行一些用户自定义的非内存清理工做,由于垃圾收集器不会处理内存之外的东西。因此,有的时候用户须要定义一些清理的方法,好比说处理文件和端口之类的非内存资源。 get
finalize的工做原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),并且只有在下一次垃圾收集过程当中,才会真正回收对象的内存.因此若是使用finalize(),就能够在垃圾收集期间进行一些重要的清除或清扫工做. io
finalize()在何时被调用?
有三种状况
1.全部对象被Garbage Collection时自动调用,好比运行System.gc()的时候.
2.程序退出时为每一个对象调用一次finalize方法。
3.显式的调用finalize方法
除此之外,正常状况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,可是jvm不保证finalize()必定被调用,也就是说,finalize()的调用是不肯定的,这也就是为何sun不提倡使用finalize()的缘由。
理解finalize( ) 正好在垃圾回收之前被调用很是重要。例如当一个对象超出了它的做用域时,finalize( ) 并不被调用。这意味着你不可能知道什么时候——甚至是否——finalize( ) 被调用。所以,你的程序应该提供其余的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操做。