- 背景:当内存中存储的数据越来越多,而GC又没有可以回收的数据,造成OOM
- GC机制的两种算法:
- 引用计数算法:对于每个数据的引用,进行计数,增加引用则加1,溢出引用则减1,GC扫码到该对象并且引用数量为0时就会被回收
- 如果两个对象,有一个属性互相保存对方的引用,此时将两个对象的引用置为null,但是相互对象内部属性还保留了一个引用
- 此时两个对象计数引用数量都为1,不能被回收,但其实两个对象都被置为了null,希望被回收,这样就出现了问题
- 所以引用计数算法回收机制不靠谱
- 可达性分析算法: 从GC ROOS作为起点,整个可以连通的为存活对象,连通不了的对象为可回收对象
- 引用计数算法:对于每个数据的引用,进行计数,增加引用则加1,溢出引用则减1,GC扫码到该对象并且引用数量为0时就会被回收
- 内存泄漏:内存泄漏最终导致的内存溢出,为强引用导致
- 原因:GC不能回收垃圾数据,造成内存泄漏.
- 对象的引用: 强引用,软引用,弱引用,虚引用
- 强引用:Object obj = new Object();
- 对于强引用,GC永远都不会回收,即使造成OOM也不会被回收
- 作为成员变量:作为强引用,置为null,可以被回收
- 作为局部变量:方法执行完成后,可以被回收
- 软引用: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回收,我们可以当做一个回调做一些其它处理工作
- 弱引用,虚引用:用法和软引用类似
- 对于弱引用,GC在扫码到该对象的时候,会回收该对象
- 对于虚引用,相当于该引用就不存在,一般用不到
内存泄漏和内存溢出
最新推荐文章于 2021-10-08 17:58:48 发布