Program Club

OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다 :-Android

proclub 2020. 12. 5. 10:50
반응형

OutOfMemoryError : 비트 맵 크기가 VM 예산을 초과합니다 :-Android


중복 가능성 :
Android : 이미지를 Bitmap 개체에로드하는 동안 이상한 메모리 부족 문제

Url에서 이미지를 다운로드하여 표시하고 있습니다. 다운로드 할 때 out of memory error : bitmap size exceeds VM budget. 드로어 블을 사용하고 있습니다. 코드는 다음과 같습니다.

HttpClient httpclient= new DefaultHttpClient();
HttpResponse response=(HttpResponse)httpclient.execute(httpRequest);
HttpEntity entity= response.getEntity();
BufferedHttpEntity bufHttpEntity=new BufferedHttpEntity(entity);
InputStream instream = bufHttpEntity.getContent();

Bitmap bm = BitmapFactory.decodeStream(instream);
Bitmap useThisBitmap = Bitmap.createScaledBitmap(bm,bm.getWidth(),bm.getHeight(), true);
bm.recycle();
BitmapDrawable bt= new BitmapDrawable(useThisBitmap);
System.gc();

다음은 오류입니다. 05-28 14:55:47.251: ERROR/AndroidRuntime(4188): java.lang.OutOfMemoryError: bitmap size exceeds VM budget


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를 호출하는 것은 좋은 생각입니다.

참고 URL : https://stackoverflow.com/questions/2928002/outofmemoryerror-bitmap-size-exceeds-vm-budget-android

반응형