Überpüfung der Speicherallokierung von .Net

14/06/2008 - 20:41 von Patrick Trübe | Report spam
Hallo zusammen,

ich kàmpfe mit dem Problem, dass ich ein .Net-Programm habe welches mit
ziemlich großen Objekten hantiert. Die Maschine auf der es das macht ist
aber leider nicht mit allzu viel RAM bestückt. Deswegen habe ich des Öfteren
das Problem, dass sich das Programm selbst und den gesamten PC in die Knie
zwingt, weil es nicht weiß, dass der RAM knapp wird und der GC nicht schnell
genug mit der leerràumen hinterher kommt.
Gibt es eine Möglichkeit in .Net, dass sich ein Programm selbst überwachen
kann. Das es also die Größe eines einzelnen Objekts bestimmen kann oder
zumindest den RAM der auf der Maschine noch frei zur Verfügung steht?

Viele Grüße und vielen Dank im voraus
Patrick Trübe
 

Lesen sie die antworten

#1 Karsten Sosna
15/06/2008 - 07:21 | Warnen spam
ich kàmpfe mit dem Problem, dass ich ein .Net-Programm habe welches mit
ziemlich großen Objekten hantiert. Die Maschine auf der es das macht ist
aber leider nicht mit allzu viel RAM bestückt. Deswegen habe ich des
Öfteren das Problem, dass sich das Programm selbst und den gesamten PC in
die Knie zwingt, weil es nicht weiß, dass der RAM knapp wird und der GC
nicht schnell genug mit der leerràumen hinterher kommt.
Gibt es eine Möglichkeit in .Net, dass sich ein Programm selbst überwachen
kann. Das es also die Größe eines einzelnen Objekts bestimmen kann oder
zumindest den RAM der auf der Maschine noch frei zur Verfügung steht?



Hallo Patrick,
wahrscheinlich disposed Du die Objekte nicht insofern sie die Schnittstelle
implementiert haben. Irgendwann macht der GC das automatisch, aber halt
irgendwann. Wenn Du irgendetwas nicht mehr brauchst, zerstöre es. Wie hier
mit Resourcen verschwenderisch umgegangen wird sehe ich oft in
Grafikroutinen.
\\\
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaint(e)
Dim BM As New Bitmap("C:\Temp\Testbild.png")
e.Graphics.DrawImageUnscaled(BM, 0, 0)
Dim PEN As New Pen(Color.Blue)
e.Graphics.DrawRectangle(PEN, 0, 0, BM.Width - 1, BM.Height - 1)
End Sub
///
Das funktioniert zwar, aber Du kannst zuschauen wie der Speicherbedarf
steigt bis irgendwann der GC zuschlàgt und wieder Resourcen frei gibt.
Richtiger:
\\\
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaint(e)
Dim BM As New Bitmap("C:\Temp\Testbild.png")
e.Graphics.DrawImageUnscaled(BM, 0, 0)
Dim PEN As New Pen(Color.Blue)
e.Graphics.DrawRectangle(PEN, 0, 0, BM.Width - 1, BM.Height - 1)
BM.Dispose()
PEN.Dispose()
End Sub
///
oder:
\\\
Protected Overrides Sub OnPaint(ByVal e As
System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaint(e)
Using BM As New Bitmap("C:\Temp\Testbild.png")
e.Graphics.DrawImageUnscaled(BM, 0, 0)
End Using
Using PEN As New Pen(Color.Blue)
e.Graphics.DrawRectangle(PEN, 0, 0, BM.Width - 1, BM.Height - 1)
End Using
End Sub
///
Wobei hier das Nachladen des Bildes wàhrend der Zeichenroutine von
schlechter Performance nur so strotzt, aber das am Rande.

Oftmals werden auch einfach Elemente geladen die vielleicht nie oder sehr
wenig benutzt werden. Auch Steuerelemente benötigen Platz, ein völlig
"überladenes" Formular tràgt auch seinen Teil dazu bei.
Also solltest Du die Anwendung des hingegen überprüfen, ob nicht wirklich
mit verschwenderischen Handeln gearbeitet wird. Nur so hast Du eine Chance
Deinen Speicher einigermaßen in den Griff zu bekommen.
Gruß Scotty

Ähnliche fragen