Java垃圾回收

来源:互联网 发布:it好不好学 编辑:程序博客网 时间:2024/06/07 06:23

当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区,


当我们创建的对象不再被引用时,所在的内存就变成了垃圾,最后等待垃圾回收机制进行回收,Java的垃圾回收机


制具有以下特征:栈内存中存放引用变量,堆内存中存放具体对象


1、垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源,比如数据库连接、网络IO等资源。


2、程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行,当对象永久性的失去引用后,系统就会在


合适的时候回收它所占的内存。


3、在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,该方法让一个引用变量重新引用该对象,从


而导致垃圾回收机制取消回收。


当一个对象在堆内存中运行时,根据它被引用变量所引用的状态,可以把它所处的状态分成以下三种:


1、可达状态:当一个对象创建后,若有一个以上的引用变量引用它,则这个对象在程序中处于可达状态,程序可


通过引用变量来调用该对象的Field和方法。


2、可恢复状态:如果程序中某个对象不再有任何引用变量引用它,它就进入了可恢复状态,在这种状态下,系统


的垃圾回收机制准备回收该对象所占的内存,在回收该对象之前,系统会调用所有可恢复状态对象的finalize()方法


进行资源清理。如果系统在调用finalize()方法时重新让一个引用变量引用该对象,则这个对象会再次变为可达状


态;否则该对象将进入不可达状态。


3、不可达状态:当对象与所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()方法后依然没有使该


对象变成可达状态,那么这个对象将永久性的失去引用,最后变成不可达状态,当一个对象处于不可达状态时,系


统才会真正回收该对象所占的内存。


对大部分对象而言,程序里会有一个引用变量引用该对象,这时最常见的引用方式,除此之外,java.lang.ref包下提


供了3个类:SoftReference、PhantomReference和WeakReference,它们分别代表了系统对对象的3种引用方


式:软引用、虚引用和弱引用,Java对对象的引用有如下4种方式:


1、强引用:这是Java程序中最常见的引用方式,程序创建一个对象,并把这个对象赋给一个引用变量,程序通过


该引用变量来操作实际的对象。当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系


统垃圾回收机制回收。


2、软引用:软引用需要通过SoftReference类来实现,当一个对象只有软引用时,它有可能会被垃圾回收机制回


收,对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可使用该对象,当系统内存


空间不足时,系统可能回收它。软引用通常用于对内存敏感的程序中。


3、弱引用:弱引用时通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低,对于只有弱


引用的对象而言,但系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并


不是说当一个对象只有弱引用时,它就会立即被回收。


4、虚引用:虚引用时通过PhantomReference类实现,虚引用完全类似于没有引用。虚引用对对象本身没有太大影


响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引


用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使


用。


引用对象由java.lang.ref.ReferenceQueue类表示,它用于保存被回收后对象的引用,当联合使用软引用、弱引用和


引用队列时,系统在回收被引用的对象之后,将把被回收对象对应的引用添加到关联的引用队列中。与软引用和弱


引用不同的是,虚引用在对象被释放之前,将把它对象的虚引用添加到它关联的引用队列中,这使得可以在对象被


回收之前采取行动。


软引用和弱引用可以单独使用,但虚引用不能单独使用,单独使用虚引用没有太大的意义,虚引用的主要作用就是


跟踪对象被垃圾回收的状态,程序可以通过检查与虚引用关联的引用队列中是否已经包含了该虚引用,从而了解虚


引用所引用的对象是否即将被回收。


0 0
原创粉丝点击