内存泄漏和内存溢出

  1. 背景:当内存中存储的数据越来越多,而GC又没有可以回收的数据,造成OOM
  2. GC机制的两种算法:
    • 引用计数算法:对于每个数据的引用,进行计数,增加引用则加1,溢出引用则减1,GC扫码到该对象并且引用数量为0时就会被回收
      • 如果两个对象,有一个属性互相保存对方的引用,此时将两个对象的引用置为null,但是相互对象内部属性还保留了一个引用
      • 此时两个对象计数引用数量都为1,不能被回收,但其实两个对象都被置为了null,希望被回收,这样就出现了问题
      • 所以引用计数算法回收机制不靠谱
    • 可达性分析算法: 从GC ROOS作为起点,整个可以连通的为存活对象,连通不了的对象为可回收对象
  3. 内存泄漏:内存泄漏最终导致的内存溢出,为强引用导致
    • 原因:GC不能回收垃圾数据,造成内存泄漏.
    • 对象的引用: 强引用,软引用,弱引用,虚引用
  4. 强引用:Object obj = new Object();
    • 对于强引用,GC永远都不会回收,即使造成OOM也不会被回收
    • 作为成员变量:作为强引用,置为null,可以被回收
    • 作为局部变量:方法执行完成后,可以被回收
  5. 软引用:SoftReference<T> ref = new SoftReference(obj);或SoftReference<T> ref = new SoftReference(obj,referenceQueue);
    • 对于软引用,GC在内存不足的时候,会回收该对象,如果内存充足则不会回收该对象,除非手动置为null或作为局部变量
    • 对于构造函数2,referenceQueue的作用是当GC回收软引用对象的时候,会将该对象的引用加入到referenceQueue中
    • 用户可以写一个循环,T t = referenceQueue.remove(); 当t!=null时,表示该对象被GC回收,我们可以当做一个回调做一些其它处理工作
  6. 弱引用,虚引用:用法和软引用类似
    • 对于弱引用,GC在扫码到该对象的时候,会回收该对象
    • 对于虚引用,相当于该引用就不存在,一般用不到

综上:强引用会导致内存泄漏,进而导致内存溢出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值