Intermittent 'Out of memory' error

L

Liverpool fan

I have a VB .NET windows application that is throwing an intermittent
'out of memory' error. Here is the call stack.

Out of memory.

at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
at System.Windows.Forms.DibGraphicsBufferManager.CreateBuffer(IntPtr
src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)
at
System.Windows.Forms.DibGraphicsBufferManager.AllocBuffer(Graphics
targetGraphics, IntPtr targetDC, Rectangle targetBounds)
at System.Windows.Forms.DibGraphicsBufferManager.AllocBuffer(IntPtr
target, Rectangle targetBounds)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32
msg, IntPtr wparam, IntPtr lparam) Source = System.Drawing



The program uses our own timer form that gives a countdown between each
processing cycle. Each processing cycle looks for reports that need
running from 3 SQL Server 2000 databases (don't ask why there are
three). Also, once a day it does a bcp load of data into each of the 3
database and runs various snapshot tasks.

I don't think the details are important besides to say it is doing a
fair amount of processing.

The question is, is this likely to be caused by memory leakage. Sounds
like it to me but I thought that I'd find out if anybody else gets this
error. The call stack is always the same but it fails at various times
of day but sometimes not for 2 weeks.

I have been monitoring the memory usage and it does go up gradually
over time from 120Mb to 150Mb. I have added garbage collection calls to
no effect.

The program uses COM in various places.

Any advice greatly appreciated.
 
L

Liverpool fan

Thanks for replying Cor. I has already tried enforcing a Garbage
Collection which seemed to help to an extent but only to decrease the
frequency of the error. I'll have a look at the articles and compare to
what I am doing already as far as COM is concerned.

Here is the Timer calling routine. I have changed it slightly in that
instead of creating a new timer dialog for each loop, I reuse the
previous one. This seems to have helped immensely but I now have a 4K
creeping of memory usage for each loop (when nothing is executed).

Private Sub StartTimer()

Dim dtloadfull, dtjobscan As Date
Dim sLoadFull As String = "Load Sales Extract"
Dim sprocessjobs As String = "Process Job Queue"

Me.ListBox1.Items.Add("Started " & Date.Now.ToString)
Me.ListBox1.SelectedIndex = Me.ListBox1.Items.Count - 1

' next order scan
dtjobscan = DateAdd(DateInterval.Minute, myJobScanInterval,
Now)

' launch the timer
f = New dlgZTimer
f.TimerIntervalSecs = 1

Do
'Clean up memory
GC.Collect

' get time of next full update. may be next day.
If myFullLoadTime = "" Then
dtloadfull = Nothing
Else
dtloadfull =
System.Convert.ToDateTime(Now.ToShortDateString & " " & myFullLoadTime)
Do While dtloadfull < Now
dtloadfull = DateAdd(DateInterval.Day, 1,
dtloadfull)
Loop
Me.lblProgress.Text = "Progress (" & "Next full
extract load at " & dtloadfull.ToString & ")"
Application.DoEvents()
End If

' next order scan
dtjobscan = DateAdd(DateInterval.Minute, myJobScanInterval,
Now)

f.TimerTitle = ""

If myFullLoadTime = "" Then
f.TimerTitle = sprocessjobs
f.TargetTime = dtjobscan
Else
' if full load is in the next 10 minutes, wait for it
If dtloadfull <= DateAdd(DateInterval.Minute, 10, Now)
Then
f.TimerTitle = sLoadFull
f.TargetTime = dtloadfull
Else
' no trans available, check for orders
f.TimerTitle = sprocessjobs
f.TargetTime = dtjobscan
End If
End If

If f.TimerTitle <> "" Then

If f.ShowDialog(Me) = DialogResult.OK Then
If f.TimerTitle = sprocessjobs Then

If myMultiThreaded = True Then
ProcessJobQueueMultiThreaded()
Else
ProcessJobQueue()
End If


' test for network connection
If myLastNetworkCheck < Now.AddHours(-1) Then
Try
DisplayHistory("******** Testing
network connection")
Dim str As String()
str =
System.IO.Directory.GetFiles(myBCP_Full_Directory)
myLastNetworkCheck = Now
Catch ex As Exception
DisplayErrorInList(ex)
End Try
End If

End If

If f.TimerTitle = sLoadFull Then
ProcessEOD()

' test to see if EOD data has been loaded
CheckEODStatus()
End If
Else
' Cancelled
f.Dispose()
f = Nothing
Exit Sub
End If
End If
Loop

End Sub

I have focussed on this because of the rate that the memory was being
used up even when the program wasn't doing anything but running the
timer. Seemed to be a prime candidate.

Any thoughts greatly appreciated.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top