2017-11-12 14 views
2

를 파괴 : 또한 당신이 이동 중지를 사용하는 것이() 메모리 누수가 있습니다 리소스를 해제하는 것이 중요하다활동 중지시() 나는 안드로이드 '활동 라이프 사이클 "튜토리얼의이 부분의 의미에 의심 과정

, 액티비티의 마지막 onDestroy() 콜백을 호출하지 않고 시스템이 자신의 액티비티를 호스팅하는 프로세스를 종료 할 수 있기 때문입니다.

내가 알다시피, 프로세스가 종료되면 관련된 모든 메모리가 할당 해제됩니다. 누수는 범위가 더 큰 구성 요소가 범위가 더 작은 구성 요소 (컨텍스트, 처리기, 내부 클래스 등의 정적 참조)에 대한 참조를 소유하는 상황입니다. 그러나 프로세스가 죽은 경우 아무런 구성 요소가 전혀 존재하지 않습니다. 그렇습니다. 나중에 다시 만들 수는 있지만 과거의 일부 "오래된"구성 요소에 대한 참조는 보유하지 않습니다. 프로세스 유출로 인해 메모리 누수가 발생할 수있는 시나리오를 보여줄 수 있습니까? 아니면 내가 내 (일부) 가정에서 완전히 잘못 되었습니까?

미리 감사드립니다.

답변

0

설명서의 문구가 좋지 않습니다. OS 프로세스가 종료되면 모든 메모리가 회수됩니다. 이 경우 메모리 누출은 없습니다.

+0

설명 주셔서 감사합니다. – StopTalking

1

보기, onStop()을 사용하지 않으면 정적 변수 또는 참조의 메모리 누수가 누출됩니다. 왜냐하면, onDestroy()가 호출 될 때까지 파괴되지 않기 때문입니다. 예 : -

1 : 더 이상 필요하지 않은 서비스/파일/연결을 중지하거나 닫습니다.

2 : Drawable을 정적 객체에 저장하지 마십시오. Drawable은 소유자 Activity에 대한 참조를 보유하고있는 소유자 View에 대한 참조를 보유하므로 Drawable을 계속 잡고 있으면 불필요하게 많은 객체/메모리를 보유하게됩니다

따라서 메모리 누수를 방지하려면 항상 onStop()에서 연결을 닫거나 정적 뷰의 null로 초기화를 설정해야합니다. 희망이 사라집니다 :)

+0

정적 참조는 onDestroy()가 호출 된 후에도 유지 될 수 있습니다. 이는 응용 프로그램 논리에 따라 다릅니다. 나는 프로세스가 살아있는 동안 정적 누설이 메모리 누출의 일반적인 이유라고 언급했다. 문제는 - 프로세스가 죽은 경우 메모리 누수가있을 수 있습니까? – StopTalking

+0

그렇지 않습니다 ... 일반적으로 메모리 누출을 보호하는 데 필요합니다 ... 정상적으로는 .. 정적 참조가 프로세스가 죽었을 때 파괴됩니다 ... 이런 일이 발생하지 않는 경우도있을 수 있습니다. – Ankit

+0

흠, 글쎄, 나는 정적 인 refs가 안드로이드를위한 어쨌든 나쁜 습관이라고 말하고 싶지만, 그들은 항상 이익보다 더 두통을 일으킨다. 하지만 mvp를 사용하고 네트워크에 동시 호출을하면 어떻게 될까요? 모든 hide/show (onStart()/onStop())에서이 호출을 만들거나 거부하고 싶지 않습니다. 전체 프로세스가 종료되고 onDestroy()가 호출되지 않으면 onStop()에서이 호출을 삭제하지 않으면 일부 스레드/발표자가 내 뷰 (작업/조각 또는 기타)를 유출해야합니까? – StopTalking