Android 内存回收检测工具

本文介绍了一款基于Android平台的简易内存泄漏检测工具,该工具模仿LeakCanary的部分原理,利用弱引用和引用队列来监控对象是否被正确回收。通过在应用中注册对象,可以检查这些对象在内存清理过程中的状态,帮助开发者定位潜在的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值