优秀Java程序员必须了解的GC工作原理

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  下面给出一个例子说明,finalize函数被调用以后,仍然可能是可达的,同时也可说明一个对象的finalize只可能运行一次。

  class MyObject{

  Test main; //记录Test对象,在finalize中时用于恢复可达性

  public MyObject(Test t)

  {

  main=t; //保存Test 对象

  }

  protected void finalize()

  {

  main.ref=this;// 恢复本对象,让本对象可达

  System.out.println(“This is finalize”);//用于测试finalize只运行一次

  }

  }

  class Test {

  MyObject ref;

  public static void main(String[] args) {

  Test test=new Test();

  test.ref=new MyObject(test);

  test.ref=null; //MyObject对象为不可达对象,finalize将被调用

  System.gc();

  if (test.ref!=null) System.out.println(“My Object还活着”);

  }

  }

  运行结果:

  This is finalize

  MyObject还活着

  此例子中,需要注意的是虽然MyObject对象在finalize中变成可达对象,但是下次回收时候,finalize却不再被调用,因为finalize函数最多只调用一次。

  程序如何与GC进行交互

  Java2 增强了内存管理功能,增加了一个java.lang.ref包,其中定义了三种引用类。这三种引用类分别为SoftReference、WeakReference和 PhantomReference.通过使用这些引用类,程序员可以在一定程度与GC进行交互,以便改善GC的工作效率。这些引用类的引用强度介于可达对象和不可达对象之间。

  创建一个引用对象也非常容易,例如如果你需要创建一个Soft Reference对象,那么首先创建一个对象,并采用普通引用方式(可达对象);然后再创建一个SoftReference引用该对象;最后将普通引用设置为null.通过这种方式,这个对象就只有一个Soft Reference引用。同时,我们称这个对象为Soft Reference 对象。

  Soft Reference的主要特点是据有较强的引用功能。只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收。另外,这些引用对象还能保证在Java抛出OutOfMemory 异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.以下给出这种引用类型的使用伪代码;

 

[1][2][3]

你说只有有缘人才可以取下,我看着你手中的戒指,

优秀Java程序员必须了解的GC工作原理

相关文章:

你感兴趣的文章:

标签云: