prosource

Android:java.lang.Out Of Memory Error: OOM까지 2097152의 사용 가능한 바이트와 2MB를 포함하는 23970828바이트 할당에 실패했습니다.

probook 2023. 6. 27. 22:23
반응형

Android:java.lang.Out Of Memory Error: OOM까지 2097152의 사용 가능한 바이트와 2MB를 포함하는 23970828바이트 할당에 실패했습니다.

이미 저장되어 있는 sd 카드의 ImageView비트맵 이미지를 표시하고 싶습니다.실행 후 응용 프로그램이 충돌하고 메모리 부족 오류가 발생합니다.

(1987년 제외)Out Of Memory Error: OOM까지 2097152의 사용 가능한 바이트와 2MB를 사용하여 23970828바이트를 할당하지 못했습니다.)

왜 기억이 안 나는지 전혀 모르겠어요.제 이미지 크기가 너무 큰 것 같아서 바꾸려고 했습니다.

Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
  Object element = it.next();
  String objElement = element.toString();
  Log.e("objElement ", " = " + objElement);
  final ImageView imageView = new ImageView (getContext());
  final ProgressBar pBar = new ProgressBar(getContext(), null, 
                                           android.R.attr.progressBarStyleSmall);
  imageView.setTag(it);
  pBar.setTag(it);

  imageView.setImageResource(R.drawable.img_placeholder);
  pBar.setVisibility(View.VISIBLE);

  if (objElement.endsWith(mp3_Pattern)) {
     Log.e("Mp3 ", " ends with ");
     pBar.setVisibility(View.GONE);
     imageView.setImageResource(R.drawable.audio_control);
  }
  if (objElement.endsWith(png_Pattern)) {
     Bitmap bitmap = BitmapFactory.decodeFile(objElement);
     int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
     int x = (bitmap.getWidth() - size) / 2;
     int y = (bitmap.getHeight() - size) / 2;
     Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
     Log.e("bitmap_Resul "," = "+ bitmap_Resul);

     if (bitmap_Resul != bitmap) {
        bitmap.recycle();
     }
     imageView.setImageBitmap(bitmap_Resul);
     Log.e("png_Pattern ", " ends with ");
     Log.e(" bitmap "," = " + bitmap);
  }

  holder.linearLayout.addView(imageView);
  holder.linearLayout.addView(pBar);

로그 고양이 정보:

08-27 14:11:15.307    1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.tazeen.classnkk, PID: 1857
    java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.Bitmap.nativeCreate(Native Method)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
            at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.makeAndAddView(ListView.java:1864)
            at android.widget.ListView.fillDown(ListView.java:698)
            at android.widget.ListView.fillFromTop(ListView.java:759)
            at android.widget.ListView.layoutChildren(ListView.java:1659)
            at android.widget.AbsListView.onLayout(AbsListView.java:2151)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Out Of Memory Error는 특히 비트맵을 처리하는 동안 안드로이드에서 발생하는 가장 일반적인 문제입니다.메모리 공간이 부족하여 개체를 할당할 수 없고 가비지 수집기에서 일부 공간을 확보할 수 없는 경우 JVM(Java Virtual Machine)에서 이 오류가 발생합니다.

할 수 .android:hardwareAccelerated="false",android:largeHeap="true"일부 환경에서 작동합니다.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Android Developer의 개념, 특히 다음과 같은 것들을 읽어보셔야 합니다.비트맵을 효율적으로 표시

5가지 주제를 모두 읽고 코드를 다시 쓰십시오.그래도 문제가 해결되지 않으면 튜토리얼 자료에 어떤 문제가 있는지 확인할 수 있습니다.

다음은 SOF의 이러한 유형의 오류에 대한 몇 가지 가능한 대답입니다.

Android:BitmapFactory.decodeStream() 메모리 부족(사용 가능한 힙이 2MB인 400KB 파일)

java.lang을 해결하는 방법.Android의 메모리 부족 오류 문제

안드로이드 : java.lang.메모리 부족 오류

자바.java.java메모리 부족 오류

Out Of MemoryError에 대한 솔루션: 비트맵 크기가 VM 예산을 초과합니다.

편집: @cjnash의 댓글에서.

이 줄을 추가한 후에도 충돌이 발생한 사람은 이미지를 res/drawable-xhdpi/ 폴더에 고정하면 이 문제가 해결됩니다.

신청서에 이것을 당신의 매니페스트에 추가해 보셨습니까? android:largeHeap="true"?

이것처럼.

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >

저에게 문제는 제 .png 파일이 메모리에서 정말 큰 비트맵으로 압축 해제된다는 것이었습니다. 왜냐하면 이미지의 크기가 매우 컸기 때문입니다(파일 크기는 작았지만).

그래서 수정은 단순히 이미지 크기를 조정하는 것이었습니다 :)

은 이 에 추가할 수 .android:hardwareAccelerated="false",android:largeHeap="true"일부 상황에서는 작동하지만 코드의 다른 부분이 이와 논쟁할 수 있습니다.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

이것은 효과가 있을 것입니다.

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);

다음과 같이 ImageView로 설정하기 전에 이미지 크기를 조정합니다.

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

여기서 size는 ImageView의 실제 크기입니다.다음을 측정하여 크기에 도달할 수 있습니다.

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

그리고 다음 사이즈를 사용합니다.imageView.getMeasuredWidth()그리고.imageView.getMeasuredHeight()위해서scaling.

아래 오류가 발생했습니다.

"E/art: 메모리 부족 오류 "OOM까지 16777120 사용 가능한 바이트와 23MB로 47251468바이트 할당 실패"

가한후를 추가한 android:largeHeap="true"AndroidManifest.xml에서 모든 오류를 제거합니다.

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">

글라이드 라이브러리를 사용하고 크기를 더 작은 크기로 변경합니다.

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);

이미지 크기를 작게 조정하여 이 문제를 해결했습니다.저는 사마린 형태를 사용하고 있습니다. PNG 이미지의 크기를 줄이면 문제가 해결됩니다.

문제: OOM까지 16777120 사용 가능한 바이트와 17MB를 사용하여 37748748바이트 할당에 실패했습니다.

솔루션: 1. 매니페스트 파일 열기 2. 내부 응용 프로그램 태그는 두 줄 아래에 추가합니다.

 android:hardwareAccelerated="false"
 android:largeHeap="true"

예:

 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

저는 'drawable' 폴더의 이미지가 고화질 전화기에서 훨씬 더 큰 이미지로 변환된다는 것을 발견했습니다.예를 들어, 200k 이미지는 800k 또는 32000k와 같은 더 높은 res로 다시 샘플링됩니다.나는 이것을 스스로 발견해야 했고 지금까지 이 힙 메모리 트랩에 대한 설명서를 보지 못했습니다.이를 방지하기 위해 모든 것을 드로잉 가능한 노드피 폴더에 넣었습니다(특정 장치 힙에 기반한 비트맵 팩토리의 '옵션' 사용).여러 개의 그릴 수 있는 폴더로 앱 크기를 확장할 수 없습니다. 특히 현재 화면 정의 범위가 너무 방대하기 때문입니다.까다로운 점은 스튜디오가 이제 프로젝트 뷰에서와 같이 'drawable-nodpi' 폴더를 구체적으로 표시하지 않고 'drawable' 폴더만 표시한다는 것입니다.주의하지 않으면 스튜디오의 이 폴더에 이미지를 떨어뜨릴 때 실제로 그리기 가능한 노드피에 이미지가 떨어지지 않습니다.

Careful here 'backgroundtest' did not actually go to drawable-nodpi and will 
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.

enter image description here

대화 상자에서 nodpi 폴더를 클릭해야 합니다. 프로젝트 보기에는 이전처럼 별도로 그릴 수 있는 폴더가 모두 표시되지 않으므로 잘못된 폴더로 이동한 것으로 즉시 나타나지 않습니다.스튜디오는 오래 전에 바닐라 '드로잉 가능'을 삭제한 후 어느 시점에 다시 만들었습니다.

enter image description here

이것은 저에게 효과가 있었습니다. 단지 그림 그리기 가능한 폴더에서 그림 그리기 가능한 hdpi로 이미지를 이동하기만 하면 됩니다.

Last but not the least....

Try Method One:

Simple Add these lines of code in the gradle file

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }

Example:

android {
    compileSdkVersion XX
    buildToolsVersion "28.X.X"

    defaultConfig {
        applicationId "com.example.xxxxx"
        minSdkVersion 14
        targetSdkVersion 19
    }

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }
}

*******************************************************************

Method Two:

Add these two lines of code in manifest file...

android:hardwareAccelerated="false" 
android:largeHeap="true"

Example:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

It will Work for sure any of these cases.....

안드로이드: largeHeap="true"가 작동하지 않는 경우

1:

이미지 압축.는 이 웹사이트를 사용하고 있습니다.

2:

이미지를 mdpi, hdpi, xhdpi, xxhdpi, xxhdpi로 변환합니다.는 이 웨비스트를 사용합니다.

안드로이드를 제거하지 마십시오. largeHeap="true"!

저도 문제가 있었어요.

위의 대부분의 다른 사람들도 마찬가지입니다.그 문제는 거대한 이미지 때문에 발생합니다.

코드를 변경할 필요 없이 일부 이미지의 크기만 조정하면 됩니다.

Soluton은 매니페스트 파일에서 이를 시도하고 Glide 라이브러리를 사용합니다.

com.github를 컴파일합니다.범프텍.글라이드:글라이드:3.7.0'

    **Use Glide Library and Override size to less size;**

 if (!TextUtils.isEmpty(message.getPicture())) {
            Glide.with(mContext).load(message.getPicture())
                    .thumbnail(0.5f)
                    .crossFade()
                    .transform(new CircleTransform(mContext))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imgProfile);
        } 

Android:하드웨어Accelerated="false"

안드로이드:largeHeap="true"

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

이 라이브러리 사용

  compile 'com.github.bumptech.glide:glide:3.7.0'   

그것의 작동하는 해피 코딩

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;


public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}

이미지 크기(MB 또는 KB)가 너무 커서 공간을 할당하지 않기 때문에 앱이 충돌하고 있습니다.따라서 이미지를 그리기 전에 크기를 줄이기만 하면 됩니다.

OR

Manifest.xml의 응용 프로그램 태그에 다음을 추가할 수 있습니다.

 android:hardwareAccelerated="false"
    android:largeHeap="true"
    android:allowBackup="true"

이 앱을 추가한 후에는 작동이 중단되지 않습니다.

  • 앱에서 항상 더 작은 크기의 이미지를 사용합니다.
  • 앱에서 큰 사이즈의 이미지를 추가할 경우 위의 구문을 추가해야 하지만 앱 크기가 증가합니다.

응용 프로그램에서 매니페스트에 추가하시겠습니까? Android: largeHeap="true"

경우에 따라(예: 루프 작업) 가비지 수집기가 코드보다 느립니다. 응답의 도우미 메서드사용하여 가비지 수집기를 기다릴 수 있습니다.

그리기 가능한 개체의 크기를 변경해야 합니다.안드로이드가 표시하기에는 너무 큽니다.이미지를 설정하는 경우 픽셀 수가 적은 이미지를 사용해 보십시오.저한테는 효과가 있어요.감사해요.:)

추가 후에 내 문제가 해결되었습니다.

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

제조 중인그라들 파일

매니페스트를 이렇게 편집하는 것은 별로 추천하지 않습니다.

안드로이드:하드웨어Accelerated="false", 안드로이드:largeHeap="true"

이러한 옵션은 앱에서 애니메이션 효과를 원활하게 수행하지 못합니다.또한 'liveData' 또는 로컬 DB(Sqlite, Room)를 변경하면 활성화 속도가 느려집니다.사용자 환경에 좋지 않습니다.

따라서 비트맵 크기 조정을 권장합니다.

아래는 샘플 코드입니다.

fun resizeBitmap(source: Bitmap): Bitmap {
      val maxResolution = 1000    //edit 'maxResolution' to fit your need
      val width = source.width
      val height = source.height
      var newWidth = width
      var newHeight = height
      val rate: Float

            if (width > height) {
                if (maxResolution < width) {
                    rate = maxResolution / width.toFloat()
                    newHeight = (height * rate).toInt()
                    newWidth = maxResolution
                }
            } else {
                if (maxResolution < height) {
                    rate = maxResolution / height.toFloat()
                    newWidth = (width * rate).toInt()
                    newHeight = maxResolution
                }
            }
            return Bitmap.createScaledBitmap(source, newWidth, newHeight, true)
 }

저는 안드로이드 개발의 초보자이지만 제 솔루션이 도움이 되길 바랍니다, 제 상태에서 완벽하게 작동합니다.저는 Imageview를 사용하고 있으며 프레임 애니메이션을 만들려고 하기 때문에 배경을 "src"로 설정합니다.동일한 오류가 발생했지만 코드화를 시도했을 때 작동했습니다.

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

100분의 50을 사용하면 원래 해상도에서 메모리 부족에 대한 앱을 중지할 수 있습니다.

50 또는 100보다 작으면 50% 또는 100보다 작으므로 메모리 부족 문제를 방지할 수 있습니다.

피카소나 글라이드같은 이미지 로딩 라이브러리를 사용합니다.이러한 라이브러리를 사용하면 향후 충돌을 방지할 수 있습니다.

만들다android:hardwareAccelerated="false"구체적으로 말하면.이것이 애니메이션 문제뿐만 아니라 동결 문제도 해결할 수 있기를 바랍니다.이렇게...

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true">
.
.
.
.
<activity android:name=".NavigationItemsFolder.GridsMenuActivityClasses.WebsiteActivity"
            android:windowSoftInputMode="adjustPan"
            android:hardwareAccelerated="false"/>
</application>

이미지를 업로드하는 경우 비트맵의 두 번째 매개 변수인 이미지 품질을 낮추십시오.이것이 제 경우의 해결책이었습니다.이전에는 90이었는데, 지금은 아래 코드와 같이 60으로 시도했습니다.

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();

가장 간단한 것을 시도해 보세요.이미지 크기(MB)가 너무 커서 공간을 할당하지 않아서 앱이 손상된 것일 수 있습니다.따라서 그리기 가능한 이미지를 붙여넣기 전에 뷰어 소프트웨어로 크기를 줄이거나 이미지를 저장하기 전보다 실행 시 갤러리에서 이미지를 가져올 경우 비트맵을 압축합니다.저한테는 효과가 있었어요. 분명 당신에겐 그럴 겁니다.

저는 새로운 활동을 할 때 예전 활동을 없애지 않았을 때 이 문제에 부딪혔습니다.는 그것을 고다습니로 .finish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

그런 다음 Applicationaction 태그에서 큰 힙 크기="true"를 추가합니다.

언급URL : https://stackoverflow.com/questions/32244851/androidjava-lang-outofmemoryerror-failed-to-allocate-a-23970828-byte-allocatio

반응형