java的垃圾回收机制详解(二)

2014-11-24 10:09:12 · 作者: · 浏览: 1

6. A a = new A();
7. ...
8.
9. // 使用a
10. ...
11.
12. // 使用完了a, 将它设置为Weak引用类型,并且释放强引用
13. WeakReference wr = new WeakReference(a);
14. a = null;
15. ...
16.
17. // 下次使用时
18. if (wr != null) {
19. a = wr.get();
20. } else {
21. a = new A();
22. wr = new WeakReference(a);
23. }
虚引用(Phantom Reference): 虚引用的用途较少,主要用于辅助finalize函数的使用。

虚引用(Phantom Reference)对象指一些执行完了finalize函数,并为不可达对象,但是还没有被GC回收的对象。这种对象可以辅助finalize进行一些后期的回收工作,我们通过覆盖了Refernce的clear()方法,增强资源回收机制的灵活性。


在实际程序设计中一般很少使用弱引用和虚引用,是用软引用的情况较多,因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。


(3) 不可视阶段
当一个对象处于不可视阶段,说明我们在其他区域的代码中已经不可以在引用它,其强引用已经消失,例如,本地变量超出了其可视
的范围。


1.try {
2. Object localObj = new Object();
3. localObj.doSomething();
4. } catch (Exception e) {
5. e.printStackTrace();
6. }
7.
8. if (true) {
9. // 此区域中localObj 对象已经不可视了, 编译器会报错。
10. localObj.doSomething();
11. }
(4) 不可到达阶段
处于不可达阶段的对象在虚拟机的对象引用根集合中再也找不到直接或间接地强引用,这些对象一般是所有线程栈中的临时变量。所有已经装载的静态变量或者是对本地代码接口的引用。


(5) 可收集阶段、终结阶段与释放阶段
当一个对象处于可收集阶段、终结阶段与释放阶段时,该对象有如下三种情况:

<1> 回收器发现该对象已经不可达。

<2> finalize方法已经被执行。

<3> 对象空间已被重用。