内存泄漏和内存溢出

ぃ、小莉子 提交于 2019-11-25 22:39:45
  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在扫码到该对象的时候,会回收该对象
    • 对于虚引用,相当于该引用就不存在,一般用不到

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!