Memory Leak in C#?

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Memory Leak in C#?

Beitrag von canlot » Mi Feb 18, 2015 5:32 pm

Hallo alle zusammen, momentan habe ich Semesterferien und da habe ich entschlossen eine Programm für meine Zwecke zu schreiben.
Werden soll es ein Lesezeichen Manager ich werde ihn wenn ich mit der Entwicklung weiter bin auch unter Projekte vorstellen.
Wo ich momentan noch Schwierigkeiten habe ist das Datenmanagement, wenn ich meine Klassen mal erzeugt habe möchte ich sie nicht überall im Programm rumkopieren
sondern alle schön von der Hauptklasse schön zugreifen über referenzen.

Ich habe ein wenig rumprobiert und zwar habe ich eine Klasse Organizer da habe ich testweise mal Daten reingeschrieben.

Code: Alles auswählen

public class Organizer
	{
		public List<BaseTree> Tree{get; private set;}
		
		public Organizer(string import, bool isCreated=true)
		{
			Tree = new List<BaseTree>();
			Tree.Add(new BaseTree("asdflsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("zsuilsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("lsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("uzilsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("klsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("jlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("hlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("dflsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("gflsdkfjsdlkfgjfkljkljsdf"));
			Tree.Add(new BaseTree("hlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("jhlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("llkjsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("llsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("ölsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("hjklsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("gjhlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("ghjlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("ertlsdkfjsdlkjfkljkljsdf"));
			Tree.Add(new BaseTree("ertlsdkfjsdlkjfkljkljsdf"));
			
			Tree[0].SubTrees.Add(new SubTree("wefghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("tzfghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("fghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("fgfghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("sdfghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("ertfghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("qwghklsdfjilfgnkl"));
			Tree[0].SubTrees.Add(new SubTree("fgfghklsdfjilfgnkl"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));
			Tree[0].SubTrees[0].addEntry(new Entry("sdfkjflgdfgjdflkgjlkjfldgjlkfj"));

			
			Tree[1].SubTrees.Add(new SubTree("fghfghklsuidfjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("fghjghkhgjlsdfjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("fghsdklsdfjitzulfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("wefghklsdfjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("fghklsdfhjjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("sffghklsdfjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("uzfghklsiudfrtzjilfgnkl"));
			Tree[1].SubTrees.Add(new SubTree("tzfghklsdfjhjilfgnkl"));
			
			
		}
	}
Die Struktur ist dabei folgende BaseTree -> SubTree -> Entry

In der MainForm erzeuge ich die Klasse

Code: Alles auswählen

Organizer organ = new Organizer("Test");
Um zu testen wie sich die Referenz verhält, übergebe ich die Klasse bei Erzeugung einer anderen wenn ich auf einen Button klicke:

Code: Alles auswählen

void SearchButtonClick(object sender, EventArgs e)
		{
			//File file = new File(ref organ);
		}
Im Taskmanager sehe ich dann die Arbeitsspeicherbelastung, und das komische dabei ist, wenn ich immer wieder drauf klicke erhöht sich die Arbeisspeicherzuweisung immer wieder.
Das habe ich mal auskommentiert und das Verhalten ist immer noch das selbe.
Komisch, vielleicht weiß der eine oder der andere was ich falsch gemacht habe bzw. was mit meinem Programm nicht stimmt.
Das Programm wird unter SharpDevelop entwickelt .Net 4.0
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3083
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Memory Leak in C#?

Beitrag von cloidnerux » Mi Feb 18, 2015 6:14 pm

Komisch, vielleicht weiß der eine oder der andere was ich falsch gemacht habe bzw. was mit meinem Programm nicht stimmt.
Die .NET Runtime(oder nutzt SharpDevelop Mono?) hat eine integrierte Speicherverwaltung(Garbage Collector). Diese ist aber nicht dauernd an, sondern wird zyklisch oder Auslastungsbasiert aufgerufen. Es kann also ein Problem sein, dass du ein Objekt verwirfst und neu anlegst, damit also immer etwas Speicher anforderst, ohne das der GC anspringt.
Interessant wäre es aber, ob das System einfach die Speicher Freigabe ignoriert und den Speicher weiterhin für dein Programm bereit hält(wg Paging), falls du neuen Speicher anforderst.

Insgesamt kann ich aber aus deinem Code und deinen Aussagen nicht mehr schließen.
Poste doch mal deine MainForm Klasse, beziehungsweise die relevanten Teile, damit man sehen kann ob da irgendwo ein Gedankenfehler ist.
Redundanz macht wiederholen unnötig.
quod erat expectandum

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Memory Leak in C#?

Beitrag von canlot » Mi Feb 18, 2015 6:35 pm

cloidnerux hat geschrieben:Die .NET Runtime(oder nutzt SharpDevelop Mono?) hat eine integrierte Speicherverwaltung(Garbage Collector).
Die NET Runtime soweit ich weiß.
cloidnerux hat geschrieben:Diese ist aber nicht dauernd an, sondern wird zyklisch oder Auslastungsbasiert aufgerufen. Es kann also ein Problem sein, dass du ein Objekt verwirfst und neu anlegst, damit also immer etwas Speicher anforderst, ohne das der GC anspringt.
Ja aber wenn ich nichts anlege oder lösche sollte sich ja nichts ändern, ich habe ja den Code auskommentiert.
cloidnerux hat geschrieben:Insgesamt kann ich aber aus deinem Code und deinen Aussagen nicht mehr schließen.
Poste doch mal deine MainForm Klasse, beziehungsweise die relevanten Teile, damit man sehen kann ob da irgendwo ein Gedankenfehler ist.
MeinForm

Code: Alles auswählen

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Objekts;
using FileSystem;

namespace LZM
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		Organizer organ = new Organizer("Test");
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			
			//
			// TODO: Add constructor code after the InitializeComponent() call.
			//
			
			BaseTree trees = new BaseTree("Ich");
			trees.addSubTree(new SubTree("Jakob"));
			trees.addSubTree(new SubTree("Jana"));
			trees.SubTrees[0].addEntry(new Entry("Computer"));
			trees.SubTrees[0].addEntry(new Entry("Schwimmen"));
			EntryListBox.ValueMember = "id";
			EntryListBox.DisplayMember = "name";
			EntryListBox.DataSource = trees.SubTrees;
			
			
		}
		
		void BaseListBoxSelectedIndexChanged(object sender, EventArgs e)
		{
			
		}
		
		void SearchButtonClick(object sender, EventArgs e)
		{
			//File file = new File(ref organ);
		}
	}
}

Code: Alles auswählen

using System;
using Objekts;

namespace FileSystem
{
	/// <summary>
	/// Description of File.
	/// </summary>
	public class File
	{
		public string FileStream{get; private set;}
		public File(ref Organizer org)
		{
			
		}
		
	}
}
Unwissenheit ist ein Segen

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Memory Leak in C#?

Beitrag von canlot » Fr Feb 20, 2015 9:53 am

Ok, ich habe ein wenig rumgetestet und es scheint so dass der Speicher wohl nur ca. bis 10K ansteigt und dann fällt er wieder.
Ich denke das Programm reserviert sich den Speicher für alle Fälle, anders könnte ich es mir nicht erklären.
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8486
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Memory Leak in C#?

Beitrag von Xin » Fr Feb 20, 2015 2:18 pm

Was eine garbage Collection macht, weiß sowieso kein Außenstehender.
10k klingt aber sehr harmlos.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten