发帖  主题  评论  推荐  标签 用户 查搜   用户 密码 自动 注册  
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 CQRS

性能主题

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。

下页

 

解道移动版 | 关注解道 | 联系解道 | 关于解道 | 广告联系 | 网站地图 | 设为首页

沪ICP证12033263 如有意见请与我们联系 Powered by JdonFramework
返回顶部