Android 内存回收检测工具
仿照 LeakCanary 部分原理,做了简易内存泄漏检测工具,可针对某些拿不准的对象检测,是否被回收。
package com.qinxue.realmtest.leakutils;
import android.util.Log;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentHashMap;
/**
* 简易内存泄漏检测工具
*/
public class LeakCheckUtils {
private static final String TAG = "LeakCheckUtils";
private ReferenceQueue<Object> referenceQueue; //内存回收时对象会放到此队列
private ConcurrentHashMap<String, WeakReference> map;//所有检测对象
private static class SingleHolder {
private static LeakCheckUtils instance = new LeakCheckUtils();
}
public static LeakCheckUtils getInstance() {
return SingleHolder.instance;
}
private LeakCheckUtils() {
referenceQueue = new ReferenceQueue<>();
map = new ConcurrentHashMap<>();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
KeyedWeakReference ref;
while ((ref = (KeyedWeakReference) referenceQueue.poll()) != null) {
Log.i(TAG, "已经回收 key: " + ref.key);
map.remove(ref.key);
}
}
}
}).start();
}
public void checkObjectLeak(Object object) {
if (object == null) return;
String key = object.getClass().getName();
Log.i(TAG, "检测对象 key: " + key);
WeakReference weakReference = new KeyedWeakReference(key, object,
referenceQueue);
map.put(key, weakReference);
}
/**
* 调用一次 jvm 内存回收
*/
public void gc() {
Log.i(TAG, "gc");
Runtime.getRuntime().gc();
System.runFinalization();
}
private static class KeyedWeakReference extends WeakReference<Object> {
public final String key;
public KeyedWeakReference(String key, Object referent, ReferenceQueue<Object> referenceQueue) {
super(referent, referenceQueue);
this.key = key;
}
}
}