内存异常的情况:
我们看到一直在上涨~
内存正常的情况:
内存有涨有跌,这样才说明内存能够被回收。
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;}}}