Memory Leak or misunderstanding?

Monkey Forums/Monkey Programming/Memory Leak or misunderstanding?

Winterstein(Posted 2013) [#1]
The following code makes the garbage collection run amok on Android (wachted with DDMS via Eclipse)

Local i:Int
Local entry:Entity

For i = 1 To 10000
  For entry = EachIn entities
  Next
Next


"entities" is of "List<Entity>"

Is this a bug in my code, in monkey or in my understanding?

This is the output of logcat

04-15 12:11:58.885: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+2ms, total 23ms
04-15 12:11:58.885: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 11ms
04-15 12:11:58.935: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+2ms, total 24ms
04-15 12:11:58.935: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 10ms
04-15 12:11:58.985: D/dalvikvm(6085): GC_CONCURRENT freed 511K, 10% free 8026K/8832K, paused 3ms+2ms, total 26ms
04-15 12:11:58.985: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 8ms
04-15 12:11:59.045: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+2ms, total 21ms
04-15 12:11:59.045: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 13ms
04-15 12:11:59.105: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+1ms, total 20ms
04-15 12:11:59.105: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 13ms
04-15 12:11:59.165: D/dalvikvm(6085): GC_CONCURRENT freed 511K, 10% free 8026K/8832K, paused 2ms+2ms, total 21ms
04-15 12:11:59.165: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 14ms
04-15 12:11:59.235: D/dalvikvm(6085): GC_CONCURRENT freed 513K, 10% free 8025K/8832K, paused 2ms+2ms, total 31ms
04-15 12:11:59.235: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 24ms
04-15 12:11:59.375: D/dalvikvm(6085): GC_CONCURRENT freed 510K, 10% free 8026K/8832K, paused 3ms+2ms, total 35ms
04-15 12:11:59.375: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 25ms
04-15 12:11:59.465: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+2ms, total 21ms
04-15 12:11:59.465: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 8ms
04-15 12:11:59.535: D/dalvikvm(6085): GC_CONCURRENT freed 512K, 10% free 8026K/8832K, paused 2ms+1ms, total 26ms
04-15 12:11:59.535: D/dalvikvm(6085): WAIT_FOR_CONCURRENT_GC blocked 12ms




muddy_shoes(Posted 2013) [#2]
The standard list implementation constructs an Enumerator object to implement the For EachIn loop so your eccentric test case is going to trigger the GC.


slenkar(Posted 2013) [#3]
yeah in real life you arent gonna iterate through a list 10,000 times and wont generate all that garbage.


Winterstein(Posted 2013) [#4]
That makes perfect sense, thank you. After checking the generated java code I now better understand whats going on :)


muddy_shoes(Posted 2013) [#5]
I believe the issue can be avoided by traversing the nodes yourself. It might require a tweak to the visibility of the Node class in list.monkey, I can't remember. I'm not sure as I've rewritten the list class and trans to re-use enumerators so my code isn't standard.