안드로이드 개발 질문/답변
(글 수 45,052)
필요한 클래스를 만들고 new 통해서 그 만든 클래스를 객체화하여 사용한후 free해 주는 방법을 알고 싶습니다.
자바에서 얼핏 봤던 object a = new object(); 이런식으로 객체화한 후 a = null 해주면, 가비지 컬랙터가 알아서 처리한다고, 봤던것 같아, 쉽게 쉽게 대충 이런식으로 코딩 하였더니. 메모리 누수현상이 발생합니다.
조언 부탁드립니다. 그리고 새해 복 많이 받으세요!
2010.02.16 13:08:36
원래 Java의 가비지 컬렉터는 null 맵핑 같은 것도 필요 없습니다. 알아서 모니터링 해서 다 쓴 객체는 릴리즈 하거든요.
메모리 누수가 정확히 어떻게 일어난다는 건지 잘 이해가 안갑니다. 주기적인 GC가 발생하고 메모리 사용률이 높을 경우는 그 주기가 짧아질텐데요.
2010.02.16 14:00:20
어플에서 사용하는 메모리의 양이 적을 경우에는 신경끄고 살아도 되긴하는데 거의 한계까지 사용하면 확실히 gc는 믿을 물건이 안되긴 하더군요. 이런 경우에는 어플단에서 최대한 그때 그때 바로 해제해주는게 좋습니다.
1) System.gc(); 얘를 명시적으로 호출하면 플랫폼 내부에서 자기가 gc하고 싶을때 gc합니다.. (한마디로 믿지말라는 말입니다 ㅎㅎ) 그래도 아 이정도쯤에선 gc한번 해주는게 낫겠다 싶으면 호출코드는 예방차원에서 넣어두면 마음이 눈꼽만큼 편해집니다;;
2) 메모리블럭을 큰걸 사용하고 더이상 필요가 없다싶으면 명시적으로 = null;을 하시면 바로 메모리에서 해제됩니다.
그리고 메모리를 많이 사용하고 있는 상황에서 화면회전 시에 상당히 골때리게 메모리부족현상이 자주일어나던데 (수많은 오브젝트들을 해제하고 다시 할당하니 프래그가 많이 발생하겠죠. 무엇보다 할당된게 바로 해제가 안되는 현상때문인듯합니다.) 이럴때는 해제하고 다시 생성하는 식으로 하는 것 보다는 큰 블럭의 경우 onRetainNonConfiruationInstance()메쏘드를 오버라이딩하는게 낫더군요.