性能主题

Java性能优化要点之二: GC垃圾回收

首页

  使用finalize() 几乎是99%的概率是错误,下面是坏的写法:

public class YourClass {

  @Override

  public void finalize() {

    // cleanup resources and destroy them

  }

}

取之以:

public class YourClass {

  public void destroy() {

    // cleanup resources and destroy them

  }

}

其中destroy方法可以通过一些依赖注入框架或Spring EJB等实现生命周期管理。

因为finalize()可能会导致:

  • 意味着GC要做更多工作
  • 无法知道finalize()方法什么时候运行
  • 与GC线程捆绑
  • 也许会让本来死去的对象复活

对于我们使用弱引用WeakReference / SoftReference,会导致:

  • 意味着GC要做更多工作 增加GC压力
  • 逻辑依赖GC ​ 也会增加GC压力

关于如何减轻GC压力方面,要注意两点:

  • 对象不是免费的午餐
  • 注意一些数据结构对GC不友好,比如Array是友好的,LinkedList则不是。

那么如何让LinkedList友好呢?只能实现自己的LinkedList,如下:

public class Entry {

  Entry next;

  Entry prev;

  public void methodA() {}

}

 

public class EntryList {

  Entry head;

  Entry tail;

  public void add(Entry entry) {}

}

两个对象,Entry自己作为节点,在EntryList中分别保存的是这个节点的头和尾的两个节点。每个Entry只能加入一个EntryList。

下页