消除过时的对象引用(6)

一、垃圾回收机制的出现,仍然须要关注内存java

  • 下述代码存在内存泄露的风险
  • 若是一个栈先增加、再收缩,栈中弹出来的对象不会被垃圾回收
  • 即便使用栈的程序再也不引用这些弹出对象,也不会被回收
  • 缘由是:栈内保存着这些弹出对象过时引用
  • 过时引用:指永远不会再被解除的引用
  • 活动部分(下标小于size)以外的引用都是过时的

二、内存泄露(无心识对象保持)一般很隐蔽缓存

  • 这种对象不会被垃圾回收,对性能存在潜在巨大威胁
  • 修复方法:一旦过时,当即清空

三、消除过时引用最好的方法:性能

  • 让包含该引用的变量,结束生命周期

四、只要类本身管理内存,警戒内存泄露问题对象

  • 元素一旦被释放,清空其全部对象引用

五、内存泄露另外一个常见地方:缓存生命周期

  • 一、缓存以外存在某个项的键引用,该项就有意义,使用WeakHashMap:
  • 缓存项的生命周期,由该键的外部引用决定,WeakHashMap才有意义
  • 二、按照先进先出原则,时间越久越没有意义:
  • LinkedHashMap的 removeEldestEntry(),清除最老项
  • 三、更复杂缓存,直接使用 java.lang.ref

六、内存泄露常见地方:监听器和其余调用内存

  • 客户端仅仅在API注册回调,没有显式的取消注册,对象会汇集
  • 确保回调当即被当作垃圾回收的最佳方法:只保存他们的弱引用WeakHashMap
相关文章
相关标签/搜索