Skip to main content

Android code lags due to logging / gc / audioManager



To keep it simple: I'm working on a small app where we want to click several objects after each other. On clicking an object, it is supposed to play a sound.





This works well, except that from time to time, the entire app (including LogCat's logging) just freezes for about 5 seconds, after which it seems to catch up. (All threads freeze) With catching up I mean; if you continue clicking during the freeze, after unfreezing, it still knows what to do.





The Log is simple:







01-17 14:52:08.292: D/AudioManager(17963): setStreamVolume(streamType:3, index:11, flags:0) 01-17 14:52:08.473: D/dalvikvm(17963): GC_CONCURRENT freed 417K, 48% free 3113K/5895K, external 140K/647K, paused 2ms+4ms





01-17 14:52:09.033: D/AudioManager(17963): setStreamVolume(streamType:3, index:11, flags:0) 01-17 14:52:09.484: D/AudioManager(17963): setStreamVolume(streamType:3, index:11, flags:0) 01-17 14:52:10.174: D/AudioManager(17963): setStreamVolume(streamType:3, index:11, flags:0) 01-17 14:52:10.785: D/AudioManager(17963): setStreamVolume(streamType:3, index:11, flags:0) 01-17 14:52:15.169: D/dalvikvm(17963): GC_EXPLICIT freed 338K, 49% free 3061K/5895K, external 140K/647K, paused 43ms







Notice the 5 second delay between the last two logs.





I tried removing all audio, but that doesn't solve anything.


A text file being logged also does not influence anything apparently.





Does anyone have a clue as how to solve this annoying problem?


Thanks in advance.






Edit:


When pausing the program during the freeze it points to a certain method. What could cause this freeze in this:





public synchronized boolean removeEntity(long id)

{

for (Entity ent : this.entities)

if (ent.getId() == id)

return this.entities.remove(ent);



return false;

}




Comments

  1. That garbage collector is doing a lot of work. Have you tried running Allocation Tracker in DDMS to find out where all this memory is being allocated? If this is a game, make sure you're not creating large objects in the main loop.

    ReplyDelete
  2. Oke, Nevermind =(

    After a days worth of debugging, it turns out I created a ye old dead lock with the synchronized methods. Just weird how it always continues when not hooked to the PC.

    My mistake!

    ReplyDelete

Post a Comment

Popular posts from this blog

Why is this Javascript much *slower* than its jQuery equivalent?

I have a HTML list of about 500 items and a "filter" box above it. I started by using jQuery to filter the list when I typed a letter (timing code added later): $('#filter').keyup( function() { var jqStart = (new Date).getTime(); var search = $(this).val().toLowerCase(); var $list = $('ul.ablist > li'); $list.each( function() { if ( $(this).text().toLowerCase().indexOf(search) === -1 ) $(this).hide(); else $(this).show(); } ); console.log('Time: ' + ((new Date).getTime() - jqStart)); } ); However, there was a couple of seconds delay after typing each letter (particularly the first letter). So I thought it may be slightly quicker if I used plain Javascript (I read recently that jQuery's each function is particularly slow). Here's my JS equivalent: document.getElementById('filter').addEventListener( 'keyup', function () { var jsStart = (new Date).getTime()...