第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Android 内存泄漏问题分析 指南

Android 内存泄漏问题分析 指南

时间:2024-03-20 21:07:43

相关推荐

Android 内存泄漏问题分析 指南

内存异常的情况:

我们看到一直在上涨~

内存正常的情况:

内存有涨有跌,这样才说明内存能够被回收。

Mat 工具的使用:

使用mat 打开hprof文件,查看你认为可能泄露的类的引用。

如果是java层导致的泄露,会有下面类似的截图:

你们能看到调用链,我这里泄露是因为用当前的context 注册了广播,没有取消注册导致的。

如果是native 的占用,可能你打开之后,看不到引用链,后面只写了native

表示你被natvie 的堆栈 或者变量占用了,这时候,就要分析代码了。看这个没啥用了。你看看当前的activity 是不是传递给了c 层。

比如,我下面就是一个native 的占用导致activity 泄漏:

有问题的:mCore.setChapterGraphKeywordCallback(new JNIChapterGraphKeywordCallbackImp(this));修改之后:/*** 这里使用静态内部类 加弱引用* 解决 内存泄漏问题* 不要直接把BookBrowserFragment 或者 Activity 传递给C 层* 容易导致内存泄漏** */static class JNIChapterGraphKeywordCallbackImp implements JNIChapterGraphKeywordCallback{private WeakReference<BookBrowserFragment> mWeakReference;public JNIChapterGraphKeywordCallbackImp(BookBrowserFragment bookBrowserFragment) {mWeakReference = new WeakReference<>(bookBrowserFragment);}@Overridepublic List<String> loadChapterGraphKeyword(int i) {BookBrowserFragment bookBrowserFragment = mWeakReference.get();if (bookBrowserFragment != null) {return bookBrowserFragment.loadChapterGraphKeyword(i);}else{return null;}}}

其实AS 也提供了查看内存的实例的方法,

下面是解决内存泄漏之前 和 之后的对比图:

总结:

mat 的使用this 查看 当前fragment 和 activity 被哪里引用了leakCarary 的功能mat 都有,而且还有native 引用内存里面的实例太多,就是被泄露了,回收不了。c层不要直接引用fragmentleakCarary 可以解决基本上java层的泄漏

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。