2011-01-28 6 views
0

생활의 참조를 찾을 수 있습니다.메모리 누수를 추적하는 방법 - UI가 활동 서비스를 시작하고 두 통신 할 수 있도록 최대 2 개 방법 AIDL 콜백을 설정</p> <p>- 나는 상당히 복잡한 응용 프로그램을

서비스는 영원히 계속 실행됩니다 (UI 활동에서 '끄기'버튼 제외).

문제는 사용자가 활동을 종료 할 때 활동 메모리가 해제되지 않는 것입니다. - UI 활동이 종료 된 경우에도 내 앱에서 사용하는 메모리 양이 동일합니다. - UI 활동이 닫힌 경우에도 여전히 힙에 mapTiles 및 기타 UI가 표시됩니다.

내 생각 엔 어떻게 든 서비스에 활동에 대한 참조가 있습니다. Activity Context 누설에 대한 경고 많은 기사를 알고 있습니다. 서비스는 응용 프로그램 범위에 저장된 약한 참조를 통해서만 활동을 참조합니다. (응용 프로그램을 확장하는 클래스)

구체적으로 활동을 참조하는 것이 무엇인지 찾는 방법이 있습니까? dominator 트리는 내 모든 메모리를 먹는 mapTiles 및 ListView 레이아웃을 보여줍니다 ...하지만 그 물건을 살아있게 유지하는 활동에 대한 참조를 찾을 수 없습니다.

또한 OutOfMemoryException이 발생하면 은 HPROF 힙 덤프를 덤프하는 방법이 있습니까? 사용자가 활동을 종료 할 때

답변

0

문제는 활동 메모리가 해제되지 입니다이다.

Android에는 'exit 활동'이 없습니다. finish()를 호출하거나 액티비티를 다시 눌러도 액티비티가 사용한 메모리에서 객체는 제거되지 않습니다. 안드로이드는 미래의 임의의 지점에서 본질적으로 스스로를 돌 봅니다.

당신이 당신의 객체를 원하는 경우

이 활동이을 완료 순간에 메모리 에서 출시 될, 당신은 수동으로 직접 해제해야합니다.

편집 : 메모리 사용을 찾는 데 사용할 수있는 클래스는 ActivityManager입니다.

+0

메뉴 -> 응용 프로그램 -> 실행중인 서비스. com.myapp의 크기가 15MB임을 보여줍니다. 나는 Activity (back arrow)를 종료하고 전화로 조금 돌아 다니는 것을 생각했을 것이다. Activity는 쓰레기를 모으고 숫자는 떨어질 것이다. 그것은 결코하지 않습니다. – paulpooch

+0

해당 화면은 서비스에만 해당됩니다. 귀하의 활동이 서비스를 시작하고 있으며 그 서비스는 귀하가 그 15MB의 메모리를 사용하여보고있는 것입니다. 이 서비스는 활동을 종료해도 중단되지 않습니다. 필요에 따라 OS에서 처리되도록 처리됩니다. 나는 현재 예를 들어 48 시간 이상 계속 된 서비스를 가지고있다 ... 마지막으로 내 전화를 재부팅했다. 서비스 코드 내에서 원하는대로이 서비스를 중지/시작할 수 있습니다. – user432209

+0

Ok - 화면이 서비스 클래스에만 해당된다는 것을 알면 좋습니다. 작업 관리자가 있습니까? 활동이 얼마나 많은 RAM을 사용하고 있는지 어떻게 알 수 있습니까? – paulpooch

0

"응용 프로그램 범위에 저장된 약한 참조를 통해 활동을 참조합니다"라는 참조가있는 사람이 아니라면 null입니까? 서비스에서 활동을 참조하는 이유는 무엇입니까? , GC를 실행하려고 했습니까? 충분한 메모리가 남아있는 한, 쓰레기를 버리는 GC는 일어나지 않을 것입니다.

+0

Activity onDestroy 내에서 WeakReference.clear()를 호출하여 Activity Reference가 사라 졌는지 확인합니다. 그것이 전자 메일 응용 프로그램 인 척 ... 서비스가 서버를 폴링하고 새 전자 메일로 로컬 DB를 업데이트합니다. 그런 다음 UI 활동 참조가 null이 아닌 경우 새 메시지를 표시하도록 알려줍니다. – paulpooch