2016-06-23 4 views
1

Android에서는 onTrimMemory 호출을 올바르게 수신하고 있으며 적절하게 반응합니다. UI가 숨겨져있을 때 저장된 UI 요소를 해제하고 메모리 사용을 50 % 줄입니다.OnTrimMemory하지만 Android에서 가비지 콜렉션 없음

문제는 각 onTrimMemory 호출 후에 안드로이드 시스템이 가비지 수집기를 실행하지 않는다는 것입니다. 나는 logcat에서 이것을 볼 수있다. 그래서 몇 가지 onTrimMemory (CRITICAL) 호출을 얻게 될 것이고 결국에는 백그라운드 프로세스가 종료 될 것입니다. 그러나 Android Studio를 사용하여 수동으로 GC를 시작하면 앱에서 메모리의 50 %를 시스템에 다시 배포하여 생존 기회를 크게 높입니다.

몇 가지 System.GC 호출을 추가 할 수 있지만 안드로이드가 메모리를 해제하는 방법과 이유는 무엇이 었는지는 모르겠지만 가비지 수집기 실행을 거부합니다. (장치 별 문제인지 궁금해하기 때문에 더 많은 장치를 테스트해야합니다.)

답변

0

중요하지 않은 리소스에 WeakReference를 사용하지 않는 이유는 무엇입니까?

+0

나는 그렇게한다. 문제는 메모리 누수가 아닙니다. 문제는 메모리가 부족하다는 것을 시스템이 알고 있음에도 불구하고 가비지 수집기가 실행되지 않는다는 것입니다. 가비지 수집기가 실행되지 않으면 WeakReference 리소스가 정리되지 않습니다. – Justin

0

이것은 특정 전화에서 발생하는 것으로 보입니다. Nexus 기기에서이를 재현 할 수 없습니다. 내 Nexus 기기는 개체를 해제하는 onTrimMemory 호출 후 가비지 수집기 통과를 수행합니다.