Android: java.lang.OutOfMemoryError: 239770828 बाइट आवंटन के साथ 2097152 मुफ्त बाइट्स और 2MB तक OOM




android-bitmap (19)

मैं sd कार्ड से ImageView में बिटमैप छवि दिखाना चाहता हूं जो पहले से ही संग्रहीत है। मेरे आवेदन को चलाने के बाद दुर्घटना हो रही है और आउटऑफ़मैरी की त्रुटि मिल रही है:

(java.lang.OutOfMemoryError: 2097152 मुफ्त बाइट और OMB तक 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)

समस्या: 16777120 नि: शुल्क बाइट और 17MB के साथ OOM तक 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">

आपका एप्लिकेशन क्रैश हो रहा है क्योंकि आपकी छवि का आकार (MB या KB में) बहुत बड़ा है इसलिए यह उसके लिए स्थान आवंटित नहीं कर रहा है। तो अपनी छवि को ड्रॉबल में चिपकाने से पहले सिर्फ आकार कम करें।

या

आप Manifest.xml पर एप्लिकेशन टैग में निम्नलिखित जोड़ सकते हैं

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

इस ऐप को जोड़ने के बाद क्रैश नहीं होगा।

  • हमेशा App में कम आकार के चित्रों का उपयोग करें।
  • यदि आप ऐप में बड़े आकार के चित्र जोड़ रहे हैं, तो आपको सिंटेक्स से ऊपर जोड़ना चाहिए, लेकिन ऐप का आकार बढ़ जाएगा।

इस तरह ImageView के लिए सेटअप से पहले अपनी छवि का आकार बदलें :

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

जहां आकार ImageView का वास्तविक आकार है। आप माप कर आकार तक पहुँच सकते हैं:

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

और scaling लिए अगले आकार की imageView.getMeasuredWidth() और imageView.getMeasuredHeight() उपयोग करें।


इसे एप्लिकेशन के तहत अपने मेनिफेस्ट में जोड़ें? एंड्रॉयड: largeHeap = "true"


क्या आपने अनुप्रयोगों के तहत इसे अपने प्रकटन में जोड़ने की कोशिश की है? 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" >

जोड़ने के बाद मेरी समस्या हल हो गई

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

Build.Gradle फ़ाइल में


मुझे लगता है कि आप इस छवि को एक आइकन के रूप में उपयोग करना चाहते हैं। जैसा कि एंड्रॉइड आपको बता रहा है, आपकी छवि बहुत बड़ी है। आपको बस अपनी छवि को स्केल करने की आवश्यकता है ताकि एंड्रॉइड को पता चले कि किस आकार का उपयोग करना है और स्क्रीन रिज़ॉल्यूशन के अनुसार कब। इसे पूरा करने के लिए, एंड्रॉइड स्टूडियो में: 1. Res फोल्डर पर राइट क्लिक करें, 2. इमेज एसेट का चयन करें। आइकॉन टाइप 4 चुनें। आइकन को एक नाम दें। 5. एसेट टाइप पर इमेज सेलेक्ट करें। 6. अपनी इमेज को ट्रिम करें अगला और फिनिश पर क्लिक करें। । अपने xml या स्रोत कोड में केवल उस छवि को देखें, जो अब चयनित संपत्ति के प्रकार के अनुसार लेआउट या mipmap फ़ोल्डर में स्थित होगी। त्रुटि दूर हो जाएगी।


मेरे लिए, समस्या यह थी कि मेरी .png फाइल स्मृति में वास्तव में बहुत बड़ा बिटमैप बनने के लिए डी-कंप्रेस की जा रही थी, क्योंकि छवि में बहुत बड़े आयाम थे (भले ही फ़ाइल का आकार छोटा था)।

तो तय था कि बस छवि का आकार बदलना है :)


मैं एंड्रॉइड के विकास में एक नौसिखिया हूं लेकिन मुझे आशा है कि मेरा समाधान मदद करता है, यह मेरी स्थिति पर पूरी तरह से काम करता है। इमेजव का उपयोग करके Im इसे "src" की पृष्ठभूमि पर सेट करें क्योंकि im एक फ्रेम एनीमेशन बनाने की कोशिश कर रहा है। मुझे वही त्रुटि मिली लेकिन जब मैंने इसे कोड करने की कोशिश की तो यह काम कर गया

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

मैं त्रुटि के नीचे गया

"ई / कला: थ्रू आउटऑफ़मेरीरोर" 16777120 मुफ्त बाइट्स और 23 एमबी तक ओओएम के साथ 47251468 बाइट आवंटन करने में विफल "

android:largeHeap="true" जोड़ने के बाद android:largeHeap="true" तो मैं सभी त्रुटियों से छुटकारा android:largeHeap="true" हूँ

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

मैंने पाया है कि 'ड्रॉबल' फोल्डर में छवियां उच्च डीईएफ़ फोन पर बहुत बड़ी छवि में परिवर्तित हो जाएंगी। उदाहरण के लिए, एक 200k छवि को 800k या 32000k जैसे उच्च रिज़ॉल्यूशन में बदल दिया जाएगा। मुझे यह अपने दम पर पता लगाना था और आज तक इस ढेर स्मृति जाल के लिए प्रलेखन नहीं देखा है। इसे रोकने के लिए मैंने एक ड्रॉबल-नॉडपी फ़ोल्डर में सब कुछ डाल दिया (विशेष उपकरण हीप के आधार पर बिटमैपफैक्टरी में 'विकल्प' का उपयोग करने के अलावा)। मैं अपने ऐप का आकार कई ड्रॉ करने योग्य फ़ोल्डरों के साथ फूला हुआ नहीं रख सकता, विशेष रूप से स्क्रीन डिफ की रेंज अब बहुत विशाल है। मुश्किल बात यह है कि स्टूडियो अब विशेष रूप से '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.

संवाद में नोड्पी फ़ोल्डर के लिए नीचे क्लिक करना सुनिश्चित करें, क्योंकि प्रोजेक्ट दृश्य आपको अलग-अलग सभी आकर्षित करने योग्य फ़ोल्डर नहीं दिखाएगा जैसे कि यह इस्तेमाल किया था, इसलिए यह तुरंत स्पष्ट नहीं होगा कि यह गलत हो गया था। स्टूडियो ने कुछ समय पहले मेरे लिए वेनिला 'ड्रॉएबल' को फिर से बनाया था:


यदि कोई छवि अपलोड कर रहा है, तो छवि गुणवत्ता को कम करने का प्रयास करें, जो बिटमैप का दूसरा पैरामीटर है। मेरे मामले में यह समाधान था। पहले यह 90 था, फिर मैंने 60 के साथ कोशिश की (जैसा कि अब नीचे दिए गए कोड में है)।

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

यह मेरे लिए काम कर रहा है: बस ड्रॉबल फोल्डर से ड्रॉएबल-एचडीपीआई में छवियों को स्थानांतरित करें।


वास्तव में आप अपनी अभिव्यक्तियों में इन पंक्तियों को जोड़ सकते हैं 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">

Picasso या Glide जैसी छवि लोड करने वाली लाइब्रेरी का उपयोग करें। इन पुस्तकालयों के उपयोग से भविष्य में दुर्घटनाओं को रोका जा सकेगा।


OutOfMemoryError Android में सबसे आम समस्या है, जबकि विशेष रूप से बिटमैप्स के साथ काम करना। यह त्रुटि जावा वर्चुअल मशीन (JVM) द्वारा फेंकी जाती है जब किसी ऑब्जेक्ट को मेमोरी स्पेस की कमी के कारण आवंटित नहीं किया जा सकता है और इसके अलावा, कचरा कलेक्टर कुछ स्थान खाली नहीं कर सकता है।

जैसा कि अलेक्सी ने उल्लेख किया है, आप अपनी मैनिफ़ेस्ट फ़ाइल में संस्थाओं के नीचे जोड़ सकते हैं 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">

आपको कुछ Androids डेवलपर कॉन्सेप्ट के बारे में निश्चित रूप से पढ़ना चाहिए, विशेष रूप से यहां: बिटमैप को कुशलतापूर्वक प्रदर्शित करना

सभी 5 विषयों को पढ़ें और अपने कोड को फिर से लिखें। यदि यह अभी भी काम नहीं करता है तो हम यह देखकर खुश होंगे कि आपने ट्यूटोरियल सामग्री के साथ क्या गलत किया है।

SOF में इस प्रकार की त्रुटियों के लिए कुछ संभावित उत्तर यहां दिए गए हैं

एंड्रॉइड: बिटमैपफैक्ट्री। टाइमस्ट्रीम () 2 एमबी मुक्त ढेर के साथ 400KB फ़ाइल के साथ मेमोरी से बाहर

एंड्रॉइड में java.lang.OutOfMemoryError की समस्या को कैसे हल करें

Android: java.lang.OutOfMemoryError

java.lang.OutOfMemoryError

OutOfMemoryError के लिए समाधान: बिटमैप का आकार VM बजट से अधिक है

संपादित करें: @cjnash की टिप्पणियों से

जिस किसी के पास इस लाइन को जोड़ने के बाद भी क्रैश हुआ था, अपनी रेस / ड्रॉबल-एक्सएचडीपीआई / फोल्डर को अपनी रेस / ड्रॉएबल / के बजाय अपनी इमेज से चिपकाकर देखें और यह आपकी समस्या को हल कर सकता है।


ग्लाइड लाइब्रेरी और ओवरराइड आकार का उपयोग कम आकार के लिए करें;

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

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();

फिर Appliaction टैग में, bigheapsize = "true जोड़ें


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.....






android-bitmap