저는 액티비티 중 90 %가 일반적인 액티비티를 상속하고 이러한 모든 액티비티가 누출되는 애플리케이션에서 작업하고 있습니다. 즉, A->B
에서 B->A
finish()
이 호출되면 B
의 onDestroy()
이 호출되지만 여전히 누수됩니다 (MAT로 확인).메모리 누수 - 안드로이드 활동이 android.os.Message에 의해 개최되었습니다.
누출 된 활동이 꽤 큽니다 (10MB ~). 그래서 몇 차례 앞뒤로 이동 한 후 앱이 OOM으로 중단됩니다.
나는 힙 덤프를 확인하고 누출 활동에 뿌리를 GC의 경로를 따라 그들은 모두 같이했습니다
그래서 나는 새는 공통의 슈퍼 클래스에 뭔가 같아요. 나는 이미 모든 BroadcastReceivers와 청취자가 활동이 파괴되고 아무런 누출을 일으키지 않을 수도있는 익명의 내부 클래스 나 Handler
이 없으면 등록을 취소했다는 것을 확인했다.
누출의 원인은 무엇일까요? 어떤 도움이라도 대단히 감사 할 것입니다. ProgressDialog
를 인스턴스화 코드의
- 일부 라인 :
편집
전 주석 때 활동이 더 이상 유출되지 않도록 코드의 두 가지가있는 것으로 나타났습니다.
Runnable
의 익명으로postDelayed
으로 전화하십시오. 첫 번째 경우에
는 대화 상자의 dismiss()
기능이 파괴되기 전에 호출되기 때문에이 문제가 될 수 이유를 모르겠어요. 두번째 경우, 에있는 Runnable
에 대해 removeCallbacks가 호출되었으므로 이론적으로 제대로 정리 되었습니까?
건배.
첫 번째 샷은 활동의 컨텍스트에 대한 참조를 유지하는 익명 또는 내부 클래스입니다. 활동 코드를 게시하여 살펴볼 수 있습니다. –
불행히도 코드를 공개 할 수 없으며 상당히 거대하고 지저분합니다. MAT 스크린 샷에서 뭐라고 말합니까? – Pin
그것은 당신이 컨텍스트를 유출하고 있으며 메시지 대기열에 보관되어 있다고 알려줍니다. 먼저, 활동에 비 정적 내부 클래스가 있는지 확인하십시오. 정적이 아닌 내부 클래스의 객체는 부모에 대한 참조를 보유하므로 다시 확인해야 할 수 있습니다. 또한 게시하는 실행 파일을 다시 확인하십시오. 실행하는 데 너무 오래 걸립니까? 메시지 대기열에 있으면 활동의 컨텍스트가 삭제되지 않습니다. –