에스비님의 글에 대해서는 적절한 지적을 달리나음님이 쓰셨네요.
2012.10.26 00:06
http://dalinaum-kr.tumblr.com/post/34289540794/misunderstanding-android-memory-management
글에 링크를 달아드렸는데, 아직 안보셨길래 따로 게시물로 올려드렸습니다.
이 글에서 제일 중요한 부분을 지적해주셨는데,
비트맵이 들어갈 부분은 OS의 버전에 따라서 달라도 정해져 있고,
에스비님의 글 처럼 비트맵이 메모리 위에 그냥 죽죽 쌓이는게 아니라
소멸자에 의해 해제되거나 recycle을 호출할때 해제되는군요.
코멘트 9
-
왕초보
10.26 00:52
-
RuBisCO
10.26 01:29
전공은 아니라 어설프게 취미로 배우는 수준에서 배우고 있긴 한데 제가 아는 선에서 이야하면, 클래스는 거기에 따른 생성자와 소멸자가 있습니다. 생성자는 예를들어 사냥개로 치자면 뽀삐란 이름으로 객체를 맹글면 생성자는 개목걸이를 걸어주고 뭐 그러는 역할을 한다고 생각하시면 됩니다. 개가 태어날때부터 목걸이차고 태어나진 못하니까요. 그리고 소멸자는 이제 토끼를 잡았으면 목적을 다 했으니 개를 잡아야겠죠. 개를 잡으면서 옆집 아저씨도 먹으러 오라고 부르고 하는겁니다. 물론 따로 정하지 않으면 그냥 잡아먹고 끝나는거구요. 자바는 사냥이 끝나고 그냥 개가 사료만 축내고 있으면 알아서 잡아줍니다. 이걸 가비지 컬렉터라고 합니다. 다만 이것은 무조건 바로바로 털어주는건 아니기 때문에 빠르게 돌릴 필요가 있으면 직접 지정을 해서 빨리 치워버리라는 겁니다.
-
왕초보
10.26 02:42
친절한 설명 감사드립니다. 원래 가비지 콜렉터는 흩어져있는 메모리 를 모아주는 역할을 했었는데요.. 요즘엔 사용한 메모리를 제대로 반납하지 않은 것을 없애주는 역할을 하나요 ? 그것은 굉장히 위험한듯 합니다. 앱이 죽을때 사용하던 모든 힙을 반납하도록 또는 OS가 따라다니다가 바로 되찾아가야 바람직한 것이 아닐까요 ? 빗맵처럼 앱이 이게 힙에 있는지 아닌지 모른다면 반납하도록 만드는 것은 말이 안되고.. OS가 알아서 해야 한다는 얘기로 보입니다.
-
piloteer
10.26 08:45
http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29
가비지 컬렉터는 예전부터 반납되지 않은 메모리를 회수하는 데에 사용되었습니다. 연결이 끊긴 클래스나 더이상 사용이 없는 자료들을 찾아 회수합니다. 꽤 오래 사용되던 방식이고 확실하게 죽은 것만 회수하기에 위험하지는 않습니다. 그냥 C++에선 수동으로 하던 게 자동으로 되었을 뿐이니까요.
대신 가비지 컬렉션이 일어나는 순간 조금의 버벅임이 있을 수는 있지요. 자바쪽(안드로이드의 경우 달빅 머신)에서 알아서 호출하기 때문에 안드로이드의 경우 운영체제의 일부라고 볼 수 있습니다.
-
현실세계에서 GC는 "신뢰할수 없는 종자"예요. 스스로도 자신을 완전히 신뢰할수 없기에, 메모리를 회수하는데 굉장히 소극적이기도 하죠. 실수로 써야 할 메모리를 회수해버리면 안되니깐요. GC가 존재하는 순간, 시스템 메모리는 무조건 많아야 합니다. 코드를 직접 짜는 개발자조차 "확실하게 죽은 것"이라는 확신을 못하는 경우가 태반인데, GC 따위가 그걸 제대로 찾을수 있으리라 기대할순 없죠.
여기에 JNI같은 Native Call이 들어가는 순간, 현장은 아비규환으로...
-
piloteer
10.26 11:08
그래서 GC만 믿고 짜면 메모리가 잘못 회수될 일은 코드에 문제가 없는 이상 잘 없지만 회수 안되는 일은 종종 있지요.
물론 jni같은 것까지 치면 더 복잡한 문제입니다만...
-
달리나음
11.13 02:24
GC가 메모리를 회수 하지 못하는 것은 "순환 참조"입니다. 그 외의 경우에는 Dalvik VM의 GC에 메모리 릭은 없습니다. 실질적으로 순환참조를 사용해야 개발할 수 있는 경우는 거의 존재하지 않고 순환참조가 발생했다는 것은 잘못된 코딩을 했다는 것을 의미합니다.
또 JNI로 Native 코드가 호출된 경우에도 제대로 짠 소프트웨어라면 제대로 메모리가 해제됩니다. 왠만한 개발환경은 메모리 릭이 발생한 시점에 스텍 트레이스와 할당 로그등을 제공해줍니다. 제대로 훈련받은 개발자라면 이런 도구로 메모리 릭을 잡는 것에 익숙해져있습니다.
-
ducky
10.26 12:42
안드로이드 한지 1년 반이 되어가지만, 이 글 보면 이게 맞는거 같고, 저 글 보면 저게 맞는 것 같고... 자괴감이 들어요;;;
참고로, 옆동네에도 처음 에스비님 글이 퍼진 이후로 지금까지도 계속 간간히 반박글이 올라옵니다.(비방글 말구요.)
결론 : 공부 좀 하자...;;;
-
왕초보
10.27 04:33
암것도 모르는 사람에게 이렇게 자세히 설명해주셔서 고맙습니다.
흠 문외한입니다만, 에스비님의 지적들은 그대로 유효한 듯이 보입니다. 예를 들어 앱이 OS의 버전을 보고 여러가지 상황을 예측하면서 맞춰서 씌어져야 하는 것일까요 아니면 OS는 앱이 볼때는 투명하게 동작하는 것이 바람직할까요 ? 즉 버전에 따라 메모리 관리 모델이 확확 바뀐다는 얘기는 아직 감 못잡았다는 얘기로 보입니다. 물론 문외한의 의견입니다.
또 비트맵이 메모리위에 죽죽 쌓이는 것은 사실이라는 얘기입니다. 물론 소멸자에 의해 해제되거나 recycle이 호출될때 해제되는데 누가 그것들을 호출하나요 ? 그리고 언제 누가 호출하는 것이 명확하지 않으면 또 어플 제작자는 최악 상황에 맞춰서 프로그램해야 한다는 얘기인데 역시 감 못잡았다는 얘기입니다. 물론 문외한의 의견입니다.
만약 소멸자나 recycle이 호출되지 않으면 계속 쌓인다면 (어플이 종료되었는데요), 그것은 진짜 문제지요. OS 문닫아야 하는 상황까지 가는 겁니다. 물론 문외한의 의견입니다.
만약 제 문외한 의견에 아주 조금이라도 의미가 있다면, 이런 문제들을 개선하려는 노력을 구글이 해줄만도 한데.. 이루어지고 있기는 한가요 ? 하드웨어를 고정하고 native로 움직이는 iOS랑, VM으로 동작하는 안드로이드가 경쟁하는 것은 시작부터 매우 불리한 싸움이라고 보는데요.