leakcanary FirestoreRecyclerAdapter 内存泄漏
leakcanary FirestoreRecyclerAdapter memory leak
我从 recyclerview
得到了金丝雀内存泄漏
D/LeakCanary: ====================================
HEAP ANALYSIS RESULT
====================================
0 APPLICATION LEAKS
References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.
====================================
1 LIBRARY LEAKS
Library Leaks are leaks coming from the Android Framework or Google libraries.
Leak pattern: instance field android.view.ViewGroup$ViewLocationHolder#mRoot
Description: In Android P, ViewLocationHolder has an mRoot field that is not cleared in its clear() method. Introduced in https://github.com/aosp-mirror/platform_frameworks_base/commit/86b326012813f09d8f1de7d6d26c986a909d Bug report: https://issuetracker.google.com/issues/112792715
40271 bytes retained by leaking objects
Signature: 64becd25d6156daa91df6572a75b6a28ddb1
┬───
│ GC Root: System class
│
├─ android.view.ViewGroup$ViewLocationHolder class
│ Leaking: NO (a class is never leaking)
│ ↓ static ViewGroup$ViewLocationHolder.sPool
│ ~~~~~
├─ android.util.Pools$SynchronizedPool instance
│ Leaking: UNKNOWN
│ ↓ Pools$SynchronizedPool.mPool
│ ~~~~~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[0]
│ ~~~
├─ android.view.ViewGroup$ViewLocationHolder instance
│ Leaking: UNKNOWN
│ ↓ ViewGroup$ViewLocationHolder.mRoot
│ ~~~~~
├─ androidx.recyclerview.widget.RecyclerView instance
│ Leaking: YES (View.mContext references a destroyed activity)
│ mContext instance of com.android.rangroceryshopping.collaborate.CollaborateActivity with mDestroyed = true
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.collaborate_rv
│ View.mWindowAttachCount = 1
│ ↓ RecyclerView.mContext
╰→ com.android.rangroceryshopping.collaborate.CollaborateActivity instance
Leaking: YES (ObjectWatcher was watching this because com.android.rangroceryshopping.collaborate.CollaborateActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)
key = d9d8e345-f645-4b3c-9f3e-5d5b7fd2cb4b
watchDurationMillis = 306199
retainedDurationMillis = 301199
====================================
METADATA
Please include this in bug reports and Stack Overflow questions.
Build.VERSION.SDK_INT: 28
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: com.android.rangroceryshopping
Analysis duration: 18611 ms
Heap dump file path: /data/user/0/com.android.rangroceryshopping/files/leakcanary/2020-03-02_08-45-57_485.hprof
Heap dump timestamp: 1583131584691
====================================
我剥离了适配器,它只包含大部分与 FirestoreRecyclerAdapter 扩展相关的变量。没有静态值,没有上下文,没有听众。我在另一个 activity 中有一个类似的适配器,没有任何问题。
我也试过将recycler的adapter设置为null,连onStop中的LayoutManager都设置为null。还是没用。
@Override
protected void onStop() {
super.onStop();
if (mAdapter != null) {
mRecyclerView.setLayoutManager( null );
mRecyclerView.setAdapter( null );
mAdapter.stopListening();
}
}
这不可能是 android 泄漏,因为其他活动也在使用相同的信息,对吗?
在泄漏信息中我看到了这个链接,但我不确定我是否理解它
答案在您粘贴的跟踪描述中:)
Description: In Android P, ViewLocationHolder has an mRoot field that is not cleared in its clear() method. Introduced in https://github.com/aosp-mirror/platform_frameworks_base/commit/86b326012813f09d8f1de7d6d26c986a909d Bug report: https://issuetracker.google.com/issues/112792715
这是一个已知的 Android 错误。
我从 recyclerview
得到了金丝雀内存泄漏D/LeakCanary: ====================================
HEAP ANALYSIS RESULT
====================================
0 APPLICATION LEAKS
References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.
====================================
1 LIBRARY LEAKS
Library Leaks are leaks coming from the Android Framework or Google libraries.
Leak pattern: instance field android.view.ViewGroup$ViewLocationHolder#mRoot
Description: In Android P, ViewLocationHolder has an mRoot field that is not cleared in its clear() method. Introduced in https://github.com/aosp-mirror/platform_frameworks_base/commit/86b326012813f09d8f1de7d6d26c986a909d Bug report: https://issuetracker.google.com/issues/112792715
40271 bytes retained by leaking objects
Signature: 64becd25d6156daa91df6572a75b6a28ddb1
┬───
│ GC Root: System class
│
├─ android.view.ViewGroup$ViewLocationHolder class
│ Leaking: NO (a class is never leaking)
│ ↓ static ViewGroup$ViewLocationHolder.sPool
│ ~~~~~
├─ android.util.Pools$SynchronizedPool instance
│ Leaking: UNKNOWN
│ ↓ Pools$SynchronizedPool.mPool
│ ~~~~~
├─ java.lang.Object[] array
│ Leaking: UNKNOWN
│ ↓ Object[].[0]
│ ~~~
├─ android.view.ViewGroup$ViewLocationHolder instance
│ Leaking: UNKNOWN
│ ↓ ViewGroup$ViewLocationHolder.mRoot
│ ~~~~~
├─ androidx.recyclerview.widget.RecyclerView instance
│ Leaking: YES (View.mContext references a destroyed activity)
│ mContext instance of com.android.rangroceryshopping.collaborate.CollaborateActivity with mDestroyed = true
│ View#mParent is set
│ View#mAttachInfo is null (view detached)
│ View.mID = R.id.collaborate_rv
│ View.mWindowAttachCount = 1
│ ↓ RecyclerView.mContext
╰→ com.android.rangroceryshopping.collaborate.CollaborateActivity instance
Leaking: YES (ObjectWatcher was watching this because com.android.rangroceryshopping.collaborate.CollaborateActivity received Activity#onDestroy() callback and Activity#mDestroyed is true)
key = d9d8e345-f645-4b3c-9f3e-5d5b7fd2cb4b
watchDurationMillis = 306199
retainedDurationMillis = 301199
====================================
METADATA
Please include this in bug reports and Stack Overflow questions.
Build.VERSION.SDK_INT: 28
Build.MANUFACTURER: samsung
LeakCanary version: 2.2
App process name: com.android.rangroceryshopping
Analysis duration: 18611 ms
Heap dump file path: /data/user/0/com.android.rangroceryshopping/files/leakcanary/2020-03-02_08-45-57_485.hprof
Heap dump timestamp: 1583131584691
====================================
我剥离了适配器,它只包含大部分与 FirestoreRecyclerAdapter 扩展相关的变量。没有静态值,没有上下文,没有听众。我在另一个 activity 中有一个类似的适配器,没有任何问题。
我也试过将recycler的adapter设置为null,连onStop中的LayoutManager都设置为null。还是没用。
@Override
protected void onStop() {
super.onStop();
if (mAdapter != null) {
mRecyclerView.setLayoutManager( null );
mRecyclerView.setAdapter( null );
mAdapter.stopListening();
}
}
这不可能是 android 泄漏,因为其他活动也在使用相同的信息,对吗?
在泄漏信息中我看到了这个链接,但我不确定我是否理解它
答案在您粘贴的跟踪描述中:)
Description: In Android P, ViewLocationHolder has an mRoot field that is not cleared in its clear() method. Introduced in https://github.com/aosp-mirror/platform_frameworks_base/commit/86b326012813f09d8f1de7d6d26c986a909d Bug report: https://issuetracker.google.com/issues/112792715
这是一个已知的 Android 错误。