카테고리 없음

[기계적 인조 인간] OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다.-Android [중복]

행복을전해요 2021. 1. 20. 09:42

decodeStream(is, outPadding, opts)함께 사용

BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
opts.inTempStorage=new byte[32 * 1024]; 
-------------------

이미지 크기를 확인한 다음 적절한 요소로 다운 샘플링 할 수 있습니다.

이 질문을 참조하십시오 : 큰 비트 맵 처리

-------------------

이 문제는 여러 번보고 된 것 같습니다. 예를 들어 여기여기 에서 ... 죄송합니다 Shalini하지만 동일한 문제라면 전혀 해결책이없는 것 같습니다 ...

Romain Guy의 유일한 조언은 메모리를 적게 사용하는 것입니다 ...

그래서, 당신의 물건을 다르게 생각하면 행운을 빕니다 ...

-------------------

마지막으로 위에서 제안한대로 이미지를 리샘플링 한 후 bitmap_file.recycle ()을 호출 할 수 있습니다 .

-------------------

사실은 일부 Android 버전에 버그가 있다는 것입니다. 특히 버전 2.1은 이와 같은 문제로 항상 실패합니다.

리소스 사용에 많은 신경을 쓴 앱을 출시했습니다. 사용하던 비트 맵도 많이 삭제했는데 이제 그래픽 프리미티브를 사용하여 즉석에서 생성됩니다. 비트 맵을 사용하지 않을 때도 재활용합니다. 물론 내 앱에 메모리 누수가 없는지 확인했습니다. 사용 된 메모리는 제어 없이는 커지지 않으며 항상 합리적인 값 내에서 유지됩니다.

이 문제를 피하기 위해 많은 노력을 기울 였지만 2.1 및 2.1-update1 장치에서 이와 같은 성가신 예외가 계속해서 발생합니다. 현재 크래시를보고하기 위해 기준을 사용하고 있으며 앱이 모든 Android 기기가 앱에 가져야하는 16M 힙 크기보다 4 배 적은 4MB의 RAM 만 사용하는 경우에도 발생한다는 것을 확인했습니다. 요즘 대부분의 장치는 16M보다 큰 힙 크기를 가지고 있습니다.

내 모든 비트 맵의 ​​크기는 800x480 픽셀입니다. 최악의 경우 ARGB_8888이 각각 1.5MB 이상을 차지하지 않을 수 있지만 4MB 만 차지하면로드하려고하면 충돌하므로 최소 12MB가 더 있어야합니다. 비어 있는. 그리고 대부분의 비트 맵은 메모리의 절반을 차지하는 ARGB_4444로로드됩니다. 비트 맵이 4444에서 정말 좋지 않을 때만 ARGB_8888을 사용합니다.

그래서 저에게는 이러한 Android 버전에서 제대로 작동하지 않는 것이 있다는 것이 매우 분명합니다. 이 충돌의 99'9 %는 2.1 및 2.1 업데이트에서 발생하며 나머지는 다른 정확한 이유에 의해 설명 될 수 있습니다.

-------------------

나는 이것이 작동하는 많은 것을 시도했습니다.

BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inDither=false;                     //Disable Dithering mode
opts.inPurgeable=true;        
opts.inScale=8;
///after you use your images
System.gc();
-------------------

이것은 런타임 에서이 문제를 피하기 위해 시도한 실용적인 대답입니다. 그리고 그것은 또한 내 문제를 해결했습니다.

Runtime.getRuntime().gc();

Garbage Collector를 호출하는 것은 좋은 생각입니다.



출처
https://stackoverflow.com/questions/22008832