1,内存中对象的状态
一个对象根据它被引用变量的状态,可以分为三种。
①可达
当一个对象创建后,要是有一个或者多个变量引用它,这个对象在程序中的状态就是可达状态。
②可恢复
对象不再用任何引用变量引用它,该对象就是可恢复状态,对象在此状态下,垃圾回收机制就准备回收该对象占用的内存,但是,在这之前,系统会调用该对象的finalize()方法进行资源清理。若系统调用该方法时,让一个或多个引用变量引用了该对象,该对象的状态就变为可达状态,否则为不可达状态。
③不可达
对象与一切引用变量的都不关联,并且系统调用了该对象的finalize()方法,还是没用把该对象的状态变为可达状态,那么该对象的状态为不可达状态,系统会回收该对象占用的资源。
2,系统强制垃圾回收
当对象处于不可达状态时,系统就可以回收对象的资源,但是至于何时被回收,对于程序是完全透明的,程序能控制一个对象能不能被引用或不被引用,但不能控制何时被回收。
我们可以通过调用System.gc()或者Runtime.getRuntime().gc()强制系统回收(只是通知系统进行回收),系统会尽快进行垃圾回收。
3,finalize
在进行垃圾回收之前,系统会调用该对象的finalize()方法进行资源的清理,这个方法继承自Object类,所以,所有的对象都具备这个方法。
java类也可以对finalize方法进行重写。只有在系统认为需要更多的内存时,垃圾回收机制才会回收资源,系统才会调用对象的finalize方法。所以,不要把对象的finalize方法当成一定会执行的方法。有可能程序终止时,对象也不会被回收。还有系统调用对象的finalize方法时也不一定是垃圾回收,有可能是使对象达到可达状态。
4,对象的引用
对于对象而言,程序中一般会有一个引用变量引用该对象,这种引用被称为强引用。其次还用另外三种引用:软引用,弱引用,虚应用。
强引用:创建对象,赋值给引用变量,这种方式称为强引用,程序可以通过该引用操作对象的方法与属性,这种对象不可能被垃圾回收,处于可达状态。
软引用:当对象只用软引用时,该对象可能会垃圾回收,当系统内存充足时,不会被垃圾回收,当内存不足时,可能会回收。软引用通过SoftRefence类来实现。软引用通常用于内存敏感的程序中。
弱引用:与软引用类似,比软引用的级别低。当对象处于弱引用时,系统垃圾回收机制运行,不管是否内存充足,都会回收该对象。弱引用通过WeakReference类实现。
虚引用:跟没有引用大致相同,虚引用主要用来跟踪对象被垃圾回收的状态,且虚引用不能单独使用,必须和引用队列联合使用。虚引用通过PhantomReference类实现。