마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

액티비티를 종료시킬때, 메모리 해제하려면, onStop()에서 변수를 null로 초기화 해줘야 하나요? 아니면 onDestroy()에서 해줘야 하나요?

0 추천
해외 사이트에서는 onDestroy()에서 해야 한다고 말씀하시고,

마스터qna사이트에서는 onStop()에서 null값을 대입해줘야 GC가 작동한다 하는데,

어떤 분 말씀이 맞는걸까요?
상쾌한 (1,510 포인트) 님이 4월 27일 질문
상쾌한님이 4월 27일 수정

1개의 답변

+1 추천
 
채택된 답변
안드로이드 라이프사이클은 상당히 복잡한 토픽입니다. 경험이 상당히 많은 개발자들도 늘 문서를 들여다 보고 테스트를 해봐야 할 정도록 헷갈리는 것 중의 하나입니다.

onDestory는 100%호출 된다는 보장이 없는 콜백입니다. 간혹 호출되지 않고 앱이 종료될 수도 있습니다. 예를 들면, 안드로이드 시스템이 메모리가 부족하거나 하는 등의 이유로 앱을 킬할 수도 있기 때문입니다. 따라서 콜백같은 경우는 onStart/onStop, onResume/onPause 등을 통해서 등록/해제를 하는 것이 확실한 방법입니다. 그리고 GC가 메모리를 콜렉트하는 것은  시스템 상황에 전적으로 달려있습니다. 이전에 제가 테스트를 해봤을 때는 첫번재 액티비티에서 두번째 액티비티를 띄운 후 두번째 액티비티를 종료한 후에도 상당한 시간동안 두번째 액티비티가 메모리에 존재하는 걸 확인한 적이 있습니다. 이 부분이 제가 생각하는 안드로이드 개발의 가장 골치 아픈 부분 중의 하나입니다.
spark (58,180 포인트) 님이 4월 27일 답변
상쾌한님이 4월 28일 채택됨
답변 감사합니다. ^^ ㅎㅎ 메모리 해제하는걸 아직 잘 몰라서 startActivity()로 액티비티 켰다가 껐다가 해보니, 메모리가 50~100MB씩 쌓이더라구요. 그래서 onActivityResult()로 켰다 껐다하니 1~2MB씩 쌓였어요. 이것 때문에 여태 해놓은걸 많이 뜯어고치고 있습니다. ㅠㅠ 너무 괴로워요. 그래도 다음 앱 만들 때에는 수월하겠다는 생각이 들어서 위로는 됐습니다. ㅎㅎ
그리고 저는 평균 메모리 사용량이 130~160MB정도 되더라구요. 이거 잘만들어진 앱들이랑 비교하면, 엄청 높은거죠? 아직 glide 사용 전이라, 버튼에 사용된 이미지들을 최적화시키지 못해서 그런것이 아닌가 싶습니다.
앱에 따라 다르겠지만, 요즘의 앱이라면 그 정도는 사용할 겁니다. 제가 만들고 있는 앱은 API 호출도 많고 매초마다 폴링을 하고 메모리 캐싱을 해야해서 텍스트만 처리하는데도 그 정도는 나옵니다.
ㅎㅎ 그렇다고 하시니 안심이 되네요. 답변 감사합니다. ^^
...