2010-12-02 3 views
3

일련의 비트 맵을 만드는 응용 프로그램이 있습니다. 나는 메모리 부족을 피하기 위해이 비트 맵을 SoftReferences에두고있다. 내 SoftReferences를 수집하기 전에 힙 크기를 최대 16MB까지 늘리고 싶습니다. 그러나 SoftReferences는 힙을 최대로 늘리기 전에 매우 열심히 수집됩니다. 참고 자료를 덜 열심히 수집하도록 강요하는 방법이 있습니까? 수동으로 힙을 최대 크기로 늘리려면? 아마 16mb 할당 된 응용 프로그램을 시작하는 방법?Android 힙 크기 및 SoftReferences

답변

3

현재 SoftReference 컬렉션 동작을 수정할 방법이 없습니다.

"수동으로 힙을 최대로 늘리는 것"이 ​​무슨 뜻인지 잘 모르겠습니다.

비트 맵 클래스의 인스턴스 인 경우 (일부 사용자 지정 비트 맵 구현과 반대) 픽셀 데이터는 실제로 네이티브 힙에 저장되지만 성가신 "외부 할당"계정 트릭을 사용하므로 상황이 더욱 복잡해집니다. (특히 저장소는 GC가 아닌 파이널 라이저에 의해 해제되고 GC가 완료된 후에는 파이널 라이저가 별도의 스레드에서 실행되어야합니다. 메모리가 부족할 때까지 비트 맵을 할당 할 수 있으며 GC는 OOM 오류가 발생하기 전에 메모리가 필요합니다.)

+0

"최대로 힙을 성장"내가 시작할 때, 내 앱 16메가바이트의 할당을 강제 할 수있는 방법을 기대했다. 다음과 동등한 것 : "-Xmx16m", from java. – ab11

+0

이것은 현재 완료된 힙의 최대 크기를 제한합니다 (Android 앱 프레임 워크가이를 VM에 정확하게 전달합니다). 초기 크기를 설정하는 "-Xms16m"을 생각하고 있었습니까? 이 옵션은 외부 할당 작업으로 인해 원하는 작업을 수행하지 않습니다. 숨겨진 메소드 (처음에 실수로 노출 된, 나중에 숨겨 짐)가 있습니다. dalvik.system.VMRuntime.setMinimumHeapSize는 대략 원했던 것이었지만, 힌트 일 뿐이며 앞으로는 사라질 가능성이 큽니다. – fadden

1

Andriod의 알려진 문제입니다. VM이 소프트 레퍼런스를 수집 할 때, 그것은 'some'를 수집해야하고 free heap이 충분히있을 때 아무것도 수집해서는 안되지만 모두를 수집하거나 전혀 수집하지 않습니다.

확인 기준 : http://code-gotcha.blogspot.com/2011/09/softreference.html