性能主题
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。