2012-03-21 2 views
6

내 응용 프로그램에서는 간단한 갤러리와 커버 플로우를 모두 사용하고 있습니다. Coverflow에서 클릭 한 이미지에 내 Coverflow 이미지 갤러리가 있습니다. 다음 활동으로 리디렉션됩니다. 전체 화면 갤러리 및 내 전체 화면 갤러리를 스크롤 할 수도 있습니다. 하지만 내 앱에 이미지 또는 고해상도 이미지를 많이 넣으면 비트 맵 크기가 VM 예산을 초과하여 강제 종료 됨내 코드에서 힙 메모리를 동적으로 비우거나 지우는 방법

그래서 덮개 플로우와 갤러리를 완료 할 때마다 힙 메모리를 지우고 싶습니다. 어떤 금액이나 내 애플 리케이션 중 하나를 도울 수 있다면 어떤 해상도의 이미지를로드 ... 내 코드에서 동적으로 내 활동을 마칠 때마다 힙 메모리를 비우는 방법? 이미 재활용 및 System.gc 방법을 시도했습니다.

+0

로맨스 녀석이 그래픽과 비트 맵에 대해 말한 것을 읽을 수 있습니다. – JoxTraex

답변

31

"힙을 지울 수 없습니다." VM은 객체가 더 이상 참조되지 않을 때 자동으로이를 수행합니다.

즉, 비트 맵은 안드로이드에서 터프한 것입니다. 메모리가 제한되어 있고 이미지를 비트 맵으로 디코딩하면 압축 된 이미지 형식 자체보다 훨씬 많은 메모리를 차지할 수 있습니다.

해결책에 대한 쉬운 대답은 없습니다. 모든 것을 올바르게 했더라도 메모리가 부족할 수 있습니다.

  1. 사용 Bitmap.release() : 말했다되는 것으로, 여기에 몇 가지 도움말입니다. 비트 맵은 네이티브 스택 (VM과 반대) 힙에 할당된다는 점에서 특별합니다. javadocs는 일반적으로 이것을 호출 할 필요가 없다고 말하면 조금 퍼지지만, 비트 맵을 지원하는 메모리로 수행되는 VM에 대한이 "단서"가 중요합니다. EDIT : Android 3.0 (API 레벨 11)에서 픽셀 데이터는 관련 비트 맵과 함께 Dalvik 힙에 저장됩니다.

  2. 비트 맵을 메모리에로드 크기가입니다. 주제에 대한 설명은 blog post입니다. 일부 장치에서는 24MB 힙만 표시되며 고해상도 이미지는 비트 맵 개체로로드 될 때 모든 이미지를 소모 할 수 있습니다. 그 주위에는 방법이 없으므로 크기를 조정해야합니다.

  3. 다른 답변으로 System.gc()을 호출하지 마십시오. GC 알고리즘을 만든 사람들은 당신과 나보다 똑똑합니다. 그들은 그들이하는 일을 알고 있습니다. GC를 통해 해제 할 수있는 메모리가있을 때 결코 OOME을 얻지 못할 것입니다 - GC는 항상 OOME을 제공하기 전에 실행됩니다.

  4. 이 것은 분명한 사실이지만 더 이상 필요하지 않은 비트 맵에 대한 참조가 없는지 확인하십시오.

  5. 마지막으로,이 하나는 엿 같아요, 안드로이드는 힙 압축을하지 않습니다. 여기에 SO question 나는 얼마 전에 만족스러운 답변을 게시했습니다. 앱이 비트 맵에 대한 큰, 또는 중간 크기의 청크를 할당 유지 당신이 메모리가 부족하지 않은 반면, 당신은 결국 어디에 상황에서 바람 때문에 간단히 말해서, 안드로이드, 연속 된만큼 더 큰 없다, 힙를 압축하지 귀하의 할당을위한 메모리 덩어리, 당신은 오메를 얻을. 내 질문에 쓴이 주변 방법은, 사용자가 종료 할 때 응용 프로그램의 프로세스를 종료하는 것입니다. 이렇게하면 다음에 시동 속도가 느려지지만 완전히 새로운 힙이 보장됩니다. 나를 잘못하지 마라. 나는 이것이 옳은 일이라고 믿을 수는 없지만 아무도 더 나은 해결책을 찾지 못했다.

+1

로메인 정보에 대한 좋은 설명 +1. – JoxTraex

+0

"romain 's info"가 아닙니다. 나는 네가하는 말을 모른다. –

+0

그는 방금 말씀 드렸듯이 그가 말한 바에 따라 기본적으로 Google의 툴킷 엔지니어 중 한 명입니다. 그리고 그의 이름은 로마인이다. – JoxTraex