原因
程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。
长生命周期对象持有短生命周期对象强引用,从而导致短生命周期对象无法被回收!
注意这里是持有对象的强引用,如果是持有对象的软引用或者是弱引用或者是虚引用则不会造成内存泄漏。
解决方案
软引用,弱引用
软引用:定义一些还有用但并非必须的对象。对于软引用关联的对象,GC不会直接回收,而是在系统将要内存溢出之前才会触发GC将这些对象进行回收。
弱引用:同样定义非必须对象。被弱引用关联的对象在GC执行时会被直接回收。
// 软饮用
User user = new User();
SoftReference<User> userSoftReference = new SoftReference<>(user)
Log.i(“tag”, userSoftReference.getName());
user = null
System.gc();
Log.i(“tag”, userSoftReference.getName());
//弱引用
User user = new User();
WeakReference<User> userWeakReference = new WeakReference<>(user)
Log.i(“tag”, userWeakReference.getName());
User = null
System.gc();
Log.i(“tag”, userWeakReference.getName());
网友评论