메모리 누수와 그 원인에 대한 기본 지식이 있습니다. 그렇기 때문에 코드에 문제가 있거나 거짓 긍정인지 이해하지 못합니다. 프로젝트가 작지 않기 때문에 코드의 어느 부분을 공유해야하는지 모르겠습니다. 그러나 의견에 알려 주면 필요한 코드를 추가 할 것입니다.
탐색 아치 구성 요소를 사용하고 MVVM 패턴을 따릅니다. 나중에 프로젝트 개발에서 LeakCanary 라이브러리를 추가했으며 화면 간을 탐색 할 때 보유 인스턴스에 대한 경고를 즉시 표시하기 시작했습니다.
백 스택에 조각을 추가하면 문제가 발생합니다. 백 스택에 추가 된 각 조각으로 보유 인스턴스의 카운터가 증가합니다. 임계 값이 5 인 LeakCanary에 도달하면 힙을 덤프하고 보고서를 제공합니다.
그러나 뒤로 버튼을 클릭하고 이전 화면으로 돌아 가면 보유 인스턴스의 카운터가 감소하고 결국 첫 번째 화면으로 돌아 가면 모든 보유 인스턴스가 사라집니다.
힙 분석 보고서를 보면 CoordinatorLayout
in xml에 대한 참조 인 변수 coordinatorLayout 이 누출 되었다고 말합니다 . 변수와 모든 사용법을 제거하고 앱을 다시 실행하면 동일한 문제가 발생하지만 xml의 다른보기에 대한 참조 인 다른 변수가 있습니다. LeakCanary가 유출 한 것으로보고 한 모든 뷰와 그 사용법을 제거하려고했습니다. 그것이라고하면 TextView
그냥 텍스트를 설정하는 데 사용되는, onViewCreated
하지 다른 곳에서는 사용, 내 코드에서 문제가 있음을 의심하기 시작 누출된다.
나는 프래그먼트에서 라이프 사이클 메소드 호출을 분석하고 이전 프래그먼트의 새 화면으로 이동할 때까지를 포함한 모든 메소드 onDestroyView
가 호출되지만 호출되지 않는 것을 알았 습니다 onDestroy
. 다시 클릭하면 onDestroy
백 스택 맨 위에 있던 조각이 호출되고 보유 인스턴스 카운터가 감소합니다.
탐색 구성 요소가 백 스택에있을 때 조각의 인스턴스를 유지하고 LeakCanary가 누출로보고 있다고 의심합니다.
onDestroyView
.