이제 공부를 시작하는 개발자입니다. 어디에 올려야 할지 몰라서 여기에 올립니다.
책을 보면 안드로이드에도 자바의 가비지콜랙션과 비슷한 기능이 있고, 엑티비티 단위로 되는 것으로 보입니다.
궁금한 것은,
제가 가진 다른 책에서는 사용자가 호출했던 화면들은 액티비티 매니저에 의해 애플리케이션 스택에 기록되고,
아무때나 이전 버튼을 누르면 스택에 저장한 이전 화면으로 이동한다고 되어 있습니다 라고 합니다.
그렇다면, 가비지의 대상이 될수 있는것은 스택에 등록된 목록보다 이전에 사용하였던 액티비티 뿐이라는 얘기인데..
컴퓨터보다 자원이 부족한 모바일에서 그럴거 같지는 않습니다.
그래서 안드로이드의 가비지 나 메모리 관리 기능에 대해 조언해 부탁드립니다.
답변 감사합니다.
제 질문이 부족했나 봅니다.
예를 들어서..
엑티비티 A 가 호출되고, B 가 호출된 이후, C 가 호출되었을 때...
B가 메모리에 조금더 부담을 준다면..어떤것이 KILL 되느냐는 얘기입니다.
이때 메모리에 부담이 되는 원흉(?)인 B를 KILL한다는 것인데..
그럼 이때..뒤로 버튼을 클릭하면 B는 KILL 되었으니 A가 보이게 된다는 것 이잖아요..
사용자 입장에서 볼때..본인이 본 이전 화면은 B인데..A가 뜬다는 것은 사용자에게 혼란을 줄수 있습니다.
제 개념으로는 엑티비티=화면 으로 생각을 하고 있습니다.
자바는 객체위주로 가비지가 되므로 상관없는데..
엑티비티가 가비지 되는것은 화면이 사라지는 것이니..
순서대로 삭제가 되지 않을 경우 위에 말씀드린 것과 같은 혼란이 있을 거 같아서 의문이 생긴 것입니다.
결국 간단히 말씀드리면 순서에 상관없이 삭제하는 것인지가 궁금한 것인지..순서대로 삭제되는지 입니다.
번거로우시겠지만, 한번 조언부탁드립니다.
Low memory killer 라는 놈이 있습니다.
Activity manager 가 스택에서 관리하는 액티비티들은 사용빈도에 따라 우선순위가 메겨져 있죠..
현재 실행중인 프로세서가 메모리 부족현상이 발생하면 OOM(Out Of Memory) 를 발생시키지 않고
이 low memory killer 가 activity manager 가 관리하는 스택을 참조해서
빈도수가 가장 낮은놈 부터 하나씩 kill 해 나가게 됩니다. 이때 액티비티의 상태는 onStop 상태인 놈들만 해당됩니다.
아,,, 그게요,,,
제가 예를 잘못들었군요...;;;
로우메모리킬러가 엑티비티를 죽이는게 아니라 프로세스를 날려버리는데요..
어떤 어플리케이션이 A가 3개의 엑티비티 A1, A2, A3를 가지고있고
다른 어플리케이션 B가 2개의 엑티비티 B1, B2를 가지고있을때
OOM이 발생할경우.....
프로세스들의 중요도에 따라 그룹으로 나눈 후에 중요도가 낮은 그룹에 있는 Process부터 하나씩 Kill하게 되는데요..
즉, B1 엑티비티를 날리는게 아니고 B프로세스를 통째로 Kill한다는거죠...
참고로..
안드로이드에서는 내가 짠 애플리케이션 프로세스의 생명주기를 직접 제어할수 없습니다..
이상이구요.. 혹시 제가 잘못알고 있는거면.. 다른 고수님들께서 다시 알려주실꺼에요^^;;
그럼.. 저녁 맛있게 드십시오...
1시간이나 남았는데 벌써배고프네요..ㅠ
제가 제대로 알고 있는건 아니지만 아는 한에서 말씀드려 볼께요.
문제가 되는 부분이나 잘못된 부분은 아시는 분께서 고쳐주시면 감사드릴께요 :)
============================================================================
gc의 경우, gc 정책이 process의 종료 ( back버튼 누를 시) 가 아닌 그냥 부족할때 종료합니다.
이종님 말씀대로, 프로세스 종료가 안드로이드 멋대로 이구요.
(gc의 타이밍을 찾아보다가 그냥 포기한적이 있었습니다.)
gc또한 프로세스의 killing이 아닌
각 프로세스별로 할당된 stack을 제거하는걸로 알고있습니다.
1byte stack, 2byte, 4byte.. 이런식으로 들고있는걸로 알고 있구요.
gc시 해당 스택의 하단부를 날리는 방식으로 처리하는걸로 알고있습니다.
액티비티또한 프로세스별로 액티비티 스택이 존재해서 처리되는걸로 알고 있구요.
진정한 고수님의 정식 답변을 기다립니다 :)
엑티비티 라이프사이클이라는게 있는데요..
사진을 올리려는데 댓글로는 잘 안올라가네요 -_-;; 네이년에 검색하시면 바로 나올껍니다..ㅎ
암튼... 그걸보시면..
엑티비티가 A가 create되고.. 엑티비티 스텍의 젤 위로 올라와 OnResume상태가 됬을때요..
또 다른 엑티비티 B가 호출되어 현재A의 위로 올라오게되면 A는 onPause상태로 빠지게되죠..
뒤로 빠진 A는 사용자에의해 다시 Resume 되거나 Stop되죠,,
근데 여기서 새로들어온 B가 메모리를 엄청나게 잡아먹어 CPU가 죽으려고 깔딱깔딱 한다면.....
엑티비티 메니져가 스택에 쌓여있던 A를 Kill하게 됩니다..
아마...ㅎㅎ
이상이구요~
좋은하루 보내십시오^^