0

This whole memory leak thing seems very complicated to me. A lot of great info here, but I cannot quite understand it. Even after reading Creating a memory leak with Java, I am still lost! Can someone point out to me where the memory leak is in this code, please? (It happens when this method is run repeatedly.) Thank you very much!

08-11 23:02:07.487: I/ViewRootImpl(969): Reporting drop result: true
08-11 23:02:07.987: D/dalvikvm(969): GC_FOR_ALLOC freed 1769K, 18% free 10101K/12180K, paused 13ms, total 13ms
08-11 23:02:08.057: D/dalvikvm(969): GC_CONCURRENT freed 4K, 11% free 10915K/12180K, paused 3ms+5ms, total 30ms
08-11 23:02:08.057: D/dalvikvm(969): WAIT_FOR_CONCURRENT_GC blocked 1ms
08-11 23:02:14.757: I/dalvikvm(969): threadid=3: reacting to signal 3
08-11 23:02:14.767: I/dalvikvm(969): Wrote stack traces to '/data/anr/traces.txt'

public void deal(View v) {

    // call and play
    if (dealt) {

        if (anteBet == playBet) {
            // hand plays
            dealt = false;
            deal.setImageResource(R.drawable.deal);
            fold.setImageResource(R.drawable.clear);
            dealersCards.clear();
            dealersCards.add(d1);
            dealersCards.add(d2);
            dealersCards.add(d3);
            displayCards(dealersCards);

            if (getHand(pc1, pc2, pc3) > getHand(dc1, dc2, dc3)
                    && getHand(dc1, dc2, dc3) >= 1120000) {
                award = true;
                ante(anteBet);
                award = true;
                play(playBet);
            } else if (getHand(dc1, dc2, dc3) < 1120000) {
                award = true;
                ante(anteBet);
            }

            else {
                if (!(getHand(pc1, pc2, pc3) == getHand(dc1, dc2, dc3))) {

                    award = true;
                    ante(-anteBet);
                    award = true;
                    play(-playBet);
                }
            }
            antePlusPayout();
            pairPlusPayout();

        } else {
            play(anteBet - playBet);
        }

        // deal cards
    } else if (anteBet > 0) {
        deal.setImageResource(R.drawable.call);
        fold.setImageResource(R.drawable.fold);
        displayCards(display);
        d1.setImageResource(R.drawable.facedown);
        d2.setImageResource(R.drawable.facedown);
        d3.setImageResource(R.drawable.facedown);
        dealt = true;
        deal.setImageResource(R.drawable.call);
    }
}

public void displayCards(List<ImageView> disp) {
    int cardNumber = 0;
    for (ImageView c : disp) {


        cardNumber++;

        Card tempCard;

        do {
            tempCard = deck.get(rand(52));
        } while (cardsInPlay.contains(tempCard));

        cardsInPlay.add(tempCard);
        rank = tempCard.getRank();
        suit = tempCard.getSuit();

        if (cardNumber == 1) {
            dc1 = tempCard;
        } else if (cardNumber == 2) {
            dc2 = tempCard;
        } else if (cardNumber == 3) {
            dc3 = tempCard;
        } else if (cardNumber == 4) {
            pc1 = tempCard;
        } else if (cardNumber == 5) {
            pc2 = tempCard;
        } else {
            pc3 = tempCard;
        }

        if (rank == 2 && suit == 'c') {
            c.setImageResource(R.drawable.clubs2);
        } else if (rank == 3 && suit == 'c') {
            c.setImageResource(R.drawable.clubs3);
        } else if (rank == 4 && suit == 'c') {
            c.setImageResource(R.drawable.clubs4);
        } else if (rank == 5 && suit == 'c') {
            c.setImageResource(R.drawable.clubs5);
        } else if (rank == 6 && suit == 'c') {
            c.setImageResource(R.drawable.clubs6);
        } else if (rank == 7 && suit == 'c') {
            c.setImageResource(R.drawable.clubs7);
        } else if (rank == 8 && suit == 'c') {
            c.setImageResource(R.drawable.clubs8);
        } else if (rank == 9 && suit == 'c') {
            c.setImageResource(R.drawable.clubs9);
        } else if (rank == 10 && suit == 'c') {
            c.setImageResource(R.drawable.clubs10);
        } else if (rank == 11 && suit == 'c') {
            c.setImageResource(R.drawable.clubsj);
        } else if (rank == 12 && suit == 'c') {
            c.setImageResource(R.drawable.clubsq);
        } else if (rank == 13 && suit == 'c') {
            c.setImageResource(R.drawable.clubsk);
        } else if (rank == 14 && suit == 'c') {
            c.setImageResource(R.drawable.clubsa);
        }

        else if (rank == 2 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds2);
        } else if (rank == 3 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds3);
        } else if (rank == 4 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds4);
        } else if (rank == 5 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds5);
        } else if (rank == 6 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds6);
        } else if (rank == 7 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds7);
        } else if (rank == 8 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds8);
        } else if (rank == 9 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds9);
        } else if (rank == 10 && suit == 'd') {
            c.setImageResource(R.drawable.diamonds10);
        } else if (rank == 11 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsj);
        } else if (rank == 12 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsq);
        } else if (rank == 13 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsk);
        } else if (rank == 14 && suit == 'd') {
            c.setImageResource(R.drawable.diamondsa);
        }

        else if (rank == 2 && suit == 'h') {
            c.setImageResource(R.drawable.hearts2);
        } else if (rank == 3 && suit == 'h') {
            c.setImageResource(R.drawable.hearts3);
        } else if (rank == 4 && suit == 'h') {
            c.setImageResource(R.drawable.hearts4);
        } else if (rank == 5 && suit == 'h') {
            c.setImageResource(R.drawable.hearts5);
        } else if (rank == 6 && suit == 'h') {
            c.setImageResource(R.drawable.hearts6);
        } else if (rank == 7 && suit == 'h') {
            c.setImageResource(R.drawable.hearts7);
        } else if (rank == 8 && suit == 'h') {
            c.setImageResource(R.drawable.hearts8);
        } else if (rank == 9 && suit == 'h') {
            c.setImageResource(R.drawable.hearts9);
        } else if (rank == 10 && suit == 'h') {
            c.setImageResource(R.drawable.hearts10);
        } else if (rank == 11 && suit == 'h') {
            c.setImageResource(R.drawable.heartsj);
        } else if (rank == 12 && suit == 'h') {
            c.setImageResource(R.drawable.heartsq);
        } else if (rank == 13 && suit == 'h') {
            c.setImageResource(R.drawable.heartsk);
        } else if (rank == 14 && suit == 'h') {
            c.setImageResource(R.drawable.heartsa);
        }

        else if (rank == 2 && suit == 's') {
            c.setImageResource(R.drawable.spades2);
        } else if (rank == 3 && suit == 's') {
            c.setImageResource(R.drawable.spades3);
        } else if (rank == 4 && suit == 's') {
            c.setImageResource(R.drawable.spades4);
        } else if (rank == 5 && suit == 's') {
            c.setImageResource(R.drawable.spades5);
        } else if (rank == 6 && suit == 's') {
            c.setImageResource(R.drawable.spades6);
        } else if (rank == 7 && suit == 's') {
            c.setImageResource(R.drawable.spades7);
        } else if (rank == 8 && suit == 's') {
            c.setImageResource(R.drawable.spades8);
        } else if (rank == 9 && suit == 's') {
            c.setImageResource(R.drawable.spades9);
        } else if (rank == 10 && suit == 's') {
            c.setImageResource(R.drawable.spades10);
        } else if (rank == 11 && suit == 's') {
            c.setImageResource(R.drawable.spadesj);
        } else if (rank == 12 && suit == 's') {
            c.setImageResource(R.drawable.spadesq);
        } else if (rank == 13 && suit == 's') {
            c.setImageResource(R.drawable.spadesk);
        } else if (rank == 14 && suit == 's') {
            c.setImageResource(R.drawable.spadesa);
        }


    }
}
trincot
  • 317,000
  • 35
  • 244
  • 286
Evorlor
  • 7,263
  • 17
  • 70
  • 141
  • 3
    I see nothing to suggest you have a memory leak. How do you know that you have one? – Simon Aug 12 '13 at 03:11
  • cuz i keep getting that GC error when i run that method – Evorlor Aug 12 '13 at 03:43
  • Those lines don't mean a leak. They mean that the phone was running out so it tried to free some of the stuff no longer used so it could be repurposed. – Gabe Sechan Aug 12 '13 at 03:45
  • but it keeps timing out and crashing when i ran the method repeatedly (which is needed in this program) – Evorlor Aug 12 '13 at 03:49
  • Before this statement call a cleanupcode function Bitmap CleanupCode(ImageView imgView) { Drawable obj = imgView.getDrawable(); if( obj instanceof BitmapDrawable) { Bitmap bmp = obj.getBitmap(); bmp.Recycle(); return bmp; } return null; } //// Bitmap bmp = CleanupCode(c); c.setImageResource(R.drawable.clubs3); if(null != bmp) { bmp.Recycle(); bmp = null; } – Pulkit Sethi Aug 12 '13 at 04:55

2 Answers2

1

In java, the usual cause of excessive memory usage, is objects being allocated and not destroyed, in some sort of loop, such as a game loop. Are you adding to a dynamic array/list of sorts in a loop? Also, if a method takes a while, this effect can happen with local variables before they are destroyed.

user2507230
  • 562
  • 1
  • 3
  • 12
  • Yes I am. I posted it above. Is that where the leak is? – Evorlor Aug 12 '13 at 03:45
  • @Evorlor Once again, the logcat you have posted shows no leak Those GC messages are routine. You understand that logcat is not just for logging errors? you did say that your app "times out" (again, nothing to do with memory leaks) and crashes so please post the stack trace for that crash from logcat. The messages you have posted are NOT errors,. – Simon Aug 12 '13 at 05:38
  • nothing is printing in my console. the app just freezes and then says: MyApp isn't responding. Do you want to close it? Wait OK – Evorlor Aug 12 '13 at 05:52
0

You need to do this with your ImageView if you change their images often

Drawable obj = imgView.getDrawable();

if( obj instanceof BitmapDrawable)
{
    Bitmap bmp = obj.getBitmap();
    bmp.Recycle();
} 

Before this statement call a cleanupcode function

Bitmap CleanupCode(ImageView imgView) {

Drawable obj = imgView.getDrawable(); 

if( obj instanceof BitmapDrawable) {

 Bitmap bmp = obj.getBitmap(); bmp.Recycle(); return bmp;
 }
 return null; 
} 
////

Bitmap bmp = CleanupCode(c); 

c.setImageResource(R.drawable.clubs3); 
if(null != bmp) {
bmp.Recycle(); 
bmp = null; 
} 
Yahya Arshad
  • 1,626
  • 2
  • 19
  • 34
Pulkit Sethi
  • 1,325
  • 1
  • 14
  • 22
  • very interesting. let me fiddle with this :) any specific details u can provide? – Evorlor Aug 12 '13 at 03:59
  • hmmm...my brief reserach is showing that using Drawable is prefereably to using Bitmap...can anyone else add on this? – Evorlor Aug 12 '13 at 04:04
  • 1
    For image view it seems that your drawables are image resources if they are then above solution is required if they are however some color or shape drawables do not use this code. I have had same problem with a custom view. Its not a memory leak its just that images are recycled very late by imageview, so had to manually do this – Pulkit Sethi Aug 12 '13 at 04:10
  • i updated the code above. any clue where its wrong now? seems like thats what u were telling me to do – Evorlor Aug 12 '13 at 20:40
  • OK...after many hours of research, I have discovered that this is NOT the solution to the problem. Thanks anyways! – Evorlor Aug 12 '13 at 20:46
  • you cannot draw recycled bitmaps yer, thats y i recycle after setting a resource – Pulkit Sethi Aug 12 '13 at 23:02