空活动中的内存泄漏

时间:2016-07-20 00:04:54

标签: android memory-leaks leakcanary

我最近决定在我的项目中使用leakcanary,所以我创建了一个空Activity的项目,仅用于测试,当我运行应用程序时(刚创建项目后没有逻辑代码或视图)我从这个库得到了内存泄漏日志:

07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * com.example.leaktest.MainActivity has leaked:
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * GC ROOT static android.app.ActivityThread.sCurrentActivityThread
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.app.ActivityThread.mActivities
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.util.ArrayMap.mArray
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references array java.lang.Object[].[1]
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * references android.app.ActivityThread$ActivityClientRecord.activity
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * leaks com.example.leaktest.MainActivity instance
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Retaining: 1.7KB.
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Reference Key: 9180226a-8a65-4c94-9d12-4562a6d88157
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Device: Genymotion generic genymotion_vbox86tp_5.1_150409_105318 vbox86tp
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Android Version: 5.1 API: 22 LeakCanary: 1.4-beta2 3799172
07-20 04:32:36.742 2967-4915/com.example.leaktest D/LeakCanary: * Durations: watch=5808ms, gc=158ms, heap dump=1953ms, analysis=15795ms

应用类:

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        refWatcher = LeakCanary.install(this);
    }

    public static RefWatcher getRefWatcher(Context context) {
        App application = (App) context.getApplicationContext();
        return application.refWatcher;
    }

    private RefWatcher refWatcher;
}

MainActivity 类:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        App.getRefWatcher(this).watch(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

我不知道为什么会这样,如果有人向我解释,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您的.woff应该采用.woff方法,而不是RefWatcher(请参阅类似的reported issue here)。

你甚至不需要这样做,因为LeakCanary会自动监视onDestroy()引用。来自FAQ

  

LeakCanary.install()返回预配置的RefWatcher。它还安装了一个ActivityRefWatcher,可以在调用Activity.onDestroy()后自动检测活动是否泄漏。