Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why my application use all memory and get OutOfMemoryError: Failed to allocate?

why this happeing all the time?i dont have even a bitmap to recycle and i dont know why my application throw memory error.

i select image from gallery here is the code to get an image from gallery then show it on some imageView.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    ImageView b = (ImageView)  findViewById(R.id.viewImage);
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            File f = new File(Environment.getExternalStorageDirectory().toString());
            for (File temp : f.listFiles()) {
                if (temp.getName().equals("temp.jpg")) {
                    f = temp;
                    break;
                }
            }
            try {
                Bitmap bitmap;
                BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();

                bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(),
                        bitmapOptions);

                b.setImageBitmap(bitmap);

                String path = android.os.Environment
                        .getExternalStorageDirectory()
                        + File.separator
                        + "Phoenix" + File.separator + "default";
                f.delete();
                OutputStream outFile = null;
                File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");
                try {
                    outFile = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile);
                    outFile.flush();
                    outFile.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (requestCode == 2) {

            Uri selectedImage = data.getData();
            String[] filePath = { MediaStore.Images.Media.DATA };
            Cursor c = getContentResolver().query(selectedImage,filePath, null, null, null);
            c.moveToFirst();
            int columnIndex = c.getColumnIndex(filePath[0]);
            String picturePath = c.getString(columnIndex);
            c.close();
            Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath));
            Log.w("path of image from gallery......******************.........", picturePath+"");
            b.setImageBitmap(thumbnail);
            b.setTag(picturePath);

        }
    }
}

after that there is 3 imagebuttons below user image(which picked from gallery). when user press on each one of them will get the name of that imageView drawable and will send to another activity then i want to watermark user image on that Imagebutton and show in one imageView

private static HashMap<Integer,String> activityMap = new HashMap<Integer,String>();
static {
    activityMap.put( R.id.agahi1,"agahi1");
    activityMap.put( R.id.agahi2,"agahi2");
}
// use this in the layout xml file for all the buttons onClick attribute
public void Clicked( View vw ) {
    String a = String.valueOf(activityMap.get(vw.getId()));

    Intent i = new Intent(this,fotCreator.class);

    ImageView b = (ImageView)  findViewById(R.id.viewImage);

    String c = (String) b.getTag();

    i.putExtra("image",c);
    i.putExtra("frame",a);
    startActivity(i);
}

this is the code for watermarker activity

    package net.svncorp.shadikade;

import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;


public class fotCreator extends ActionBarActivity {
    private AsyncCaller myasync;
    private ProgressBar bar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fot_creator);
        //progress bar
        bar = (ProgressBar) this.findViewById(R.id.progressBar);


        MainActivity.checkversion(this);


    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        this.finish();
    }
    @Override
    protected void onResume() {
        super.onResume();
        myasync = new AsyncCaller();
        myasync.execute();

    }

    private class AsyncCaller extends AsyncTask<Void, Void, Drawable>
    {



        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            bar.setVisibility(View.VISIBLE);
        }
        @Override
        protected Drawable doInBackground(Void... params) {

            try {            // simulate here the slow activity
                Intent intent = getIntent();

                final String frame = intent.getStringExtra("frame");
                String image = intent.getStringExtra("image");
                Resources resources = getResources();
                int id = resources.getIdentifier(frame, "drawable", getPackageName());
                Drawable d = resources.getDrawable(id);
                return d;


            } catch (Exception e1) {
                e1.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Drawable result) {
            super.onPostExecute(result);

            //this method will be running on UI thread
            ImageView finalimage = (ImageView)findViewById(R.id.finalimage);
            if (isCancelled() || result == null) {
                return;
            }
            finalimage.setImageDrawable(result);
            bar.setVisibility(View.GONE);

        }



    }


    @Override
    protected void onPause() {
        super.onPause();
        myasync.cancel(true);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_fot_creator, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }



}

now this code works so fast for 2 or 3 times of pressing imagebuttons and go to watermarker activty but its keep getting slower and slower and sometimes it freeze in emulator and i see these in logcat

 11-24 15:01:45.960    7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 2419(163KB) AllocSpace objects, 1(1047KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms
11-24 15:01:48.760    7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:48.760    7751-7768/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:48.760    7751-7768/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 1047KB allocation
11-24 15:01:48.790    7751-7768/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 1303(86KB) AllocSpace objects, 1(993KB) LOS objects, 12% free, 13MB/15MB, paused 0 total 30ms
11-24 15:01:53.700    7751-7751/net.svncorp.shadikade I/Choreographer﹕ Skipped 1272 frames!  The application may be doing too much work on its main thread.
11-24 15:01:55.350    7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.350    7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.350    7751-7769/net.svncorp.shadikade I/art﹕ Forcing collection of SoftReferences for 993KB allocation
11-24 15:01:55.380    7751-7769/net.svncorp.shadikade I/art﹕ Clamp target GC heap from 17MB to 16MB
11-24 15:01:55.380    7751-7769/net.svncorp.shadikade I/art﹕ Alloc concurrent mark sweep GC freed 218(9KB) AllocSpace objects, 0(0B) LOS objects, 5% free, 15MB/16MB, paused 0 total 30ms
11-24 15:01:55.380    7751-7769/net.svncorp.shadikade E/art﹕ Throwing OutOfMemoryError "Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB until OOM"
11-24 15:01:55.380    7751-7769/net.svncorp.shadikade D/skia﹕ --- decoder->decode returned false
11-24 15:01:55.380    7751-7769/net.svncorp.shadikade E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2
    Process: net.svncorp.shadikade, PID: 7751
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.OutOfMemoryError: Failed to allocate a 1017612 byte allocation with 954752 free bytes and 932KB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
            at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
            at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
            at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:973)
            at android.content.res.Resources.loadDrawableForCookie(Resources.java:2423)
            at android.content.res.Resources.loadDrawable(Resources.java:2330)
            at android.content.res.Resources.getDrawable(Resources.java:758)
            at android.content.res.Resources.getDrawable(Resources.java:724)
            at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:65)
            at net.svncorp.shadikade.fotCreator$AsyncCaller.doInBackground(fotCreator.java:45)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

i think this is the problem of many others like me... Any help will be appreciated.

like image 648
Nika Amiri Avatar asked Nov 24 '14 23:11

Nika Amiri


People also ask

How do I fix I have out of memory exception?

1) An easy way to solve OutOfMemoryError in java is to increase the maximum heap size by using JVM options "-Xmx512M", this will immediately solve your OutOfMemoryError.

What causes out of memory error in Java?

OutOfMemoryError exception. Usually, this error is thrown when there is insufficient space to allocate an object in the Java heap. In this case, The garbage collector cannot make space available to accommodate a new object, and the heap cannot be expanded further.

What causes out of memory errors?

An out of memory error causes programs — or even the entire computer — to power down. This problem is typically caused either by low random access memory (RAM), too many programs or hardware pieces running at once, or a large cache size that absorbs a large amount of memory.


1 Answers

Maybe adding this line in Manifest on application tags will help you;

<application
        ...
        ...
        android:largeHeap="true" >  

     ......
     ......

</application>
like image 153
Cüneyt Avatar answered Sep 26 '22 00:09

Cüneyt