Java之垃圾回收机制
垃圾回收机制的特征
1.垃圾回收机制只负责回收堆内存中的对象,不回收任何物理资源
2.程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久性地失去引用后,系统就会在
合适的时候回收它所占的内存。
3.在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法可能使该对象重新复活。(让一个
引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
对象在内存中的状态
1.可达状态: 当一个对象被创建后,若有一个以上的引用变量引用它,则这个对象在程序中处于不可达状态,
程序可通过引用变量来调用该对象的Field和方法。
2.可恢复状态: 如果程序中某个对象不再有任何引用变量引用它,它就进入可恢复状态。在这种状态下,系统垃
圾回收机制准备回收该对象所占用的内存,在回收该对象之前,系统会调用所有可恢复对象的
finalize()方法进行资源清理。如果系统在调用finalize()方法时重新让一个引用变量引用该对象,
则这个对象会再次变为可达状态;否则该对象进入不可达状态。
3.不可达状态:当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()方法后依然没有使
该对象变成可达状态,那么这个对象将永久性地失去引用,最后编程不可达状态。只有当一个
对象处于不可达状态时,系统才会真正回收该对象所占用的资源。
对象的软,弱和虚引用
1.强引用:程序创建一个对象,并把这个对象赋给一个引用变量,程序通过该引用对象来操作实际的对象,当一
个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。
2.软引用:需要通过SoftReference类来实现,当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于
只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象;当系统
内存空间不足时,系统可能会回收它,软引用通常用于对内存敏感程序中。
3.弱引用:需要通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引
用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内
存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收---正如那么失去引用的对象一样
,必须等到系统垃圾回收机制运行时才会被回收。
4.虚引用:通过PhantomReference类实现,虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对
象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同
。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列联合使
用。
对象软,弱,虚引用的作用
使用这些引用类可以避免在程序执行期间将对象留在内存中。如果以软,弱和虚引用的方式引用对象,垃圾收集
器就能够随意地释放对象。如果系统尽可能减小程序在其生命周期中所占用的内存大小时,这些引用类就很有用
处。