user3332929
user3332929

Reputation: 315

java.lang.OutOfMemoryError. Android

I'm not too far on in developing my app and i'm getting a java.lang.OutOfMemoryError. Here's the logcat:

02-24 14:02:54.957: E/art(28628): Throwing OutOfMemoryError "Failed to allocate a 28 byte allocation with 8 free bytes and 8B until OOM" (recursive case)
02-24 14:02:54.965: E/art(28628): "FinalizerDaemon" daemon prio=5 tid=8 Runnable
02-24 14:02:54.965: E/art(28628):   | group="system" sCount=0 dsCount=0 obj=0x12c260e0 self=0xac4a5400
02-24 14:02:54.965: E/art(28628):   | sysTid=28641 nice=0 cgrp=apps sched=0/0 handle=0xac4b9b00
02-24 14:02:54.965: E/art(28628):   | state=R schedstat=( 2442370612 111306164 635 ) utm=229 stm=15 core=1 HZ=100
02-24 14:02:54.965: E/art(28628):   | stack=0xb40fe000-0xb4100000 stackSize=1036KB
02-24 14:02:54.965: E/art(28628):   | held mutexes= "mutator lock"(shared held)
02-24 14:02:54.965: E/art(28628):   at com.android.internal.os.BinderInternal$GcWatcher.finalize(BinderInternal.java:51)
02-24 14:02:54.965: E/art(28628):   at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:190)
02-24 14:02:54.965: E/art(28628):   at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:173)
02-24 14:02:54.965: E/art(28628):   at java.lang.Thread.run(Thread.java:818)
02-24 14:02:54.965: E/System(28628): Uncaught exception thrown by finalizer

I'm trying to make a list and anytime I retrieve the data to make the list I get the error.

Here is class that extends the list fragment

`

public class BillReminderListFragment extends ListFragment {
private ArrayList<Bill> mBills;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    mBills = BillLab.get(getActivity()).getBills(); <---(this is what is causing the error)
}
}

Here is the class that holds the data

public class BillLab {
private ArrayList<Bill> mBills;
private static BillLab sBillLab;
private Context mAppBillContext;

private BillLab(Context appBillContext){
    mAppBillContext = appBillContext;
    mBills = new ArrayList<Bill>();
    for (int i = 0; 1 < 100; i ++){
        Bill b = new Bill();
        b.setTitle("Bill #" + i);
        b.setDate(new Date());
        mBills.add(b);
    }
}

public static BillLab get(Context c){
    if (sBillLab == null){
        sBillLab = new BillLab(c.getApplicationContext());


    }
    return sBillLab;
}

public Bill getBill(UUID id){
    for (Bill b: mBills) {
        if (b.getId().equals(id))
            return b;
    }
    return null;
}

public ArrayList<Bill> getBills(){
    return mBills;
}

}

Please help. This is my final project in college and I don't have much time. Thank you.

`

Upvotes: 0

Views: 2143

Answers (3)

zeisuke
zeisuke

Reputation: 192

this method had 2 root cause, one is mention by @Nag edi, but the root cause for made java.lang.OutOfMemoryError is: -

private BillLab(Context appBillContext){
    mAppBillContext = appBillContext;
    mBills = new ArrayList<Bill>();
    for (int i = 0; 1 < 100; i ++){  // this line will cause the infinity loop only    
        Bill b = new Bill();      // this is the root cause to create every single object for each loop.
        b.setTitle("Bill #" + i);
        b.setDate(new Date());
        mBills.add(b);
    }
}

to :-

   private BillLab(Context appBillContext){
        mAppBillContext = appBillContext;
        mBills = new ArrayList<Bill>();
        Bill b = null;
        for (int i = 0; i < 100; i ++){
            b = new Bill();
            b.setTitle("Bill #" + i);
            b.setDate(new Date());
            mBills.add(b);
        }
    }

Upvotes: 0

Nagaraju V
Nagaraju V

Reputation: 2757

Change following line

for (int i = 0; 1 < 100; i ++){

to

for (int i = 0; i < 100; i ++){

Upvotes: 1

ekchang
ekchang

Reputation: 939

Your for loop has a typo: for (int i = 0; 1 < 100; i ++)

should be i < 100. It's running out of memory because 1 is always less than 100.

Upvotes: 5

Related Questions