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

List Collection의 메모리 누수 가능성

0 추천

현재 작업 중인 프로젝트에서 다수의 ArrayList를 사용 중 입니다.

 

ArrayList<CombinedData> dataList = new ArrayList<>();
dataList.add(data1);
dataList.add(data2);
dataList.add(data3);
dataList.add(data4);
...

 

프로그램 내에서 위와 같이 사용 중인 ArrayList를 비우고, 다시 할당하는 경우가 많은데, (참고로CombinedData 는 직접 만든 클래스이고 멤버 인스턴스를 여러 개 가지고 있는 형태입니다.) 비우는 방법은 제가 아는 바로는 다음과 같이 3가지 정도로 정리 할 수 있을 것 같은데요.

 

1. dataList = new ArrayList<>();    // 비우지 않고 새로 생성.

2. dataList.clear();

3. dataList.removeAll();

 

위 3가지 모두 메모리 누수에 대한 문제를 걱정할 필요가 없는 것인지 궁금합니다. GC가 진행되는 시점의 차이만 있을 뿐이지 결국 모두 GC가 이뤄지게 되는 것인지요.

pigstoe (510 포인트) 님이 2023년 7월 26일 질문

1개의 답변

+1 추천
 
채택된 답변
일단 GC는 OS 정책에 의해 결정됩니다.

요즘은 닫힌 리커시브 참조 같은 것도 곧잘 잡아서 치워주죠...

다음으로 어레이이의 clear(), removeAll()은 결과적으로 비슷화게 보일순 있어도 기능이 다른 함수 입니다.

실제 동작이 어케 다른지는 조금만 찾아보시거나 removeAll() 에서 collection<> 을 받는것만 보더라도 알 수 있지요.

요즘은 필요없다고 어디선가 본거 같은데 특수한 경우 List를 상속하여 클리어 함수를 제정의 할수도 있습니다.

예를들어 Bitmap 이라면 가지고 있는 아이템들을 루프를 돌면서 recycle()을 호출해준다던지....
비애천사 (12,080 포인트) 님이 2023년 7월 26일 답변
pigstoe님이 2023년 7월 26일 채택됨
아... 중요한걸 빼먹었네요 만드신 클래스가 어떻게 구성된진 몰라도 TypedArray 처럼 명시적인 뒷처리가 필요한게 아니라면 그냥 clear() 함수만 호출하더라도 memory 누수가 발생하진 않습니다.
물론 중간에 절묘한 시점에 크래쉬가 터진다던가 하면 얘기가 또 다르겠지만...
Context 같이 뷰에 대한 참조 등을 가지고 있는 경우가 아니라면, 비애천사님 말씀처럼  GC에게 일임을 하시면 됩니다.  Leacanary같은 툴을 사용해보면 Context 때문에 메모리누수가 발생하는 경우가 잦고 대부분입니다.
질문에 대한 답변은 물론 주변 이야기까지 해주셔서 풍성하게 얻어가네요. 두분 모두 감사합니다.
...