Difference between GCMemAlloced and Task Manager

BlitzMax Forums/BlitzMax Programming/Difference between GCMemAlloced and Task Manager

Afke(Posted 2012) [#1]
Hi guys,

According to Windows Task Manager my Game has huge Memory Leak. The problem is That GCMemAlloced() function shows different results from Task Manager , and according to GCMemAlloced() there is no memory leak at all.

GCMemAlloced() returns between 11831280 - 14611024 And Task Manager shows 430,844 K

I wrote simple Type for Memory Usage Debuging to handle the problem

SuperStrict

Type GFDebugObject
	Field idx:Int
	Field name:String
	Field cnt:Int
	Field rm:Int
EndType

Type GFDebug
Global creted:Int
Global destroyed:Int
Global index:Int
Global list:TList = New TList
Global lastTime:Int
Global mem:Int
Method Add:Int(n:String)
     index:+1
	creted:+1
	Local in:Short = False
	For Local o:GFDebugObject = EachIn list
		If n = o.name
			in = True
			o.cnt:+1
			Exit
		End If
			
	Next
		If Not in
			Local o:GFDebugObject = New GFDebugObject
			o.idx = index
			o.name = n
			o.cnt = 1
			list.AddLast(o)
		End If
End Method
	
Method Remove(n:String)
	destroyed:+1
	For Local o:GFDebugObject = EachIn list
		If o.name = n
			o.rm:+1
		End If
	Next
		
End Method

Method Draw()
	Local y:Int = 20
	SetColor 0, 0, 0
	SetAlpha 0.6
	DrawRect(480, 0, 500, list.Count() * 15 + 50)
	SetColor 255, 0, 0
	SetAlpha 1
		
	Local t1:Int = MilliSecs()
	If t1 > lastTime + 1000
		lastTime = t1
		mem = GCMemAlloced()
		Print mem
	End If
	DrawText("Total Memory Usage : " + mem + "  Total Created " + GFD.creted + " Total Deleted " + GFD.destroyed + "  Live = " + (GFD.creted - GFD.destroyed), 500, y)
	SetColor 255, 255, 0
	For Local o:GFDebugObject = EachIn list
		y:+15
		DrawText("Class >> " + o.name + "  Created = " + o.cnt + "  Destroyed = " + o.rm + "  Live Objects = " + (o.cnt - o.rm), 500, y)
	Next
End Method
EndType


Usage Example

Global GFD:GFDebug = New GFDebug

Type MyType
Field a:Int

Method New()
     If GFD GFD.Add("MyType")
EndMethod
Method Delete()
     If GFD GFD.Remove("MyType")
EndMethod
EndType


In every Type I add those and everything works great. There is no MemLeak at all

Any idea what is going on here?

Thanks

Last edited 2012


ziggy(Posted 2012) [#2]
The RAM shown on task manager is the RAM that windows windows is assigning to your program, not the RAM your program is using. Windows does a balance between the mem a program is using, the amount of RAM it is requesting and at wich ratio, and the available system RAM, in order to speed things up, and prevent mem fragmentation, so it pre-asignates more RAM if available, in order to make memalloc operations faster, and avoid memory swaps.

All in all, the memory usage displayed on the task manager is not a reliable information unless you see it growin and growing without end to absurd values. then there's a mem leak.


Afke(Posted 2012) [#3]
Hi Ziggy,

Thanks for your post . Yes it growing in Task Manager to 800,000 - 900,000 but in same time not growing according to GCMemAlloced() .

I'm confused :)

Edit:

I am using Threaded Build

Last edited 2012


ziggy(Posted 2012) [#4]
Yes, but it ends at some point or it does get your whole system mem? If it's not causing performance issues, don't bother it's usualy windows assigning more ram that required to ensure smoth performance


Afke(Posted 2012) [#5]
HeHe I have to try on some other machine I have 8.0 GB ,I am not sure .


ziggy(Posted 2012) [#6]
By the way, unles you're actually using multithreading on your source code, using a thread build will make your application use more ram and run a bit slower


Afke(Posted 2012) [#7]
Thanks again,

My game is Hidden Object game , open world , where you can walk from scene to scene ,which means every new screen is new level. I use multithreading just for level loading system ,to switch between levels faster and smoother.