Memory-Leak vs. Memory Waste

by robert 15. April 2010 14:55

kurzer Nachtrag zum vorherigen Post. Eigentlich kann management Code für sich keine Memory-Leak haben. Es ist lediglich möglich Speicher schlecht zu nutzen, in dem er zum Beispiel zu lange gehalten wird. Technisch ist das kein Memory-Leak. Nur unmanaged Code kann nicht mehr verwalteten Speicher zurück lassen. Deswegen suchen wir streng genommen vermutlich eher nach "Memory-Waste"!

ASP.NET Memory-Leak

by robert 15. April 2010 14:38

Wir sind auf der Suche nach einem Memory-Leak für Camping.Info. Es ist jetzt Donnerstag, 11:56Uhr. Der Web-Server läuft jetzt erst seit 16 Stunden.   Die aktuelle Session-Zahl liegt bei 652. Den Session Timeout von 20min rausgerechnet, bei einer Verweildauer von 7 Minuten, entspricht das ungefähr 70 tatsächlich aktiven, parallelen Besuchern zu diesem Zeitpunkt. (Im laufen des Tages, werden das deutlich mehr.) Der Speicherverbrauch ist für die aktuelle Session-Zahl zu hoch und steigt anscheinend stetig über mehrere Tage hinweg. Es gibt 2 Möglichkeiten für Memory-Leaks in Managed-Code. Referenzen auf Objekte werde nicht wieder frei gegeben, in dem Sie Beispielsweise im ASP.NET Cache gehalten werden. NET Code verwendet unmanaged Resourcen wie FileSystem oder "Datenbank-Connections und diese Resourcen werden nicht wieder explizit frei gegeben. Auch “System.Drawing" stellt ein Problem dar, da es auf unmanagement Resourcen verweist. Oliver hat einen Dump erstellt der wie folgt aussieht:   Wir sind auf der Suche, über die Lösung des Problems werden wir berichten.

Vorsicht bei String als Lock-Objekt

by Oliver 20. March 2010 14:59

Wenn man denn unbedingt einen String als Lock-Objekt nutzen will und man sich davon überzeugt hat, nicht den Type eines gerade durch die Methode schwirrenden Objektes zu nutzen (das könnte ja jeder machen ;-)), dann sollte man auf jeden Fall an String.Intern(myLockString) denken! Wo man kann, sollte man also weiterhin einen einfachen object-Lock nutzen: 1: private static readonly object _lock = new object(); Aber man darf dann nicht vergessen, dass alle Threads, die auf den Code im Lock zugreifen von einem einzigen Lock bedient werden. Wenn man die Threads aber in Gruppen aufteilen kann, die unabhängig voneinander arbeiten können, ist diese Beschränkung zu scharf. Ich suchte also einen Weg, einen eindeutigen Lock für jede dieser Gruppen (hier: TranslationGroup) zu generieren, der von allen Instanzen geteilt wird. Der Gruppenidentifikator heißt hier _pageNameKey. Beispiel: 1: private const string _migrateLock = "9B90360AAF4342798A739DA2D85AF5AF"; // guid 2:  3: private string _pageNameKey = ...; // can be the same in multiple parallel threads 4:  5: public void Migrate(string oldGroupName, Dictionary<string, string> controlIdsOldToNew) 6: { 7: lock (string.Intern(_migrateLock + _pageNameKey)) 8: { 9: // do something not here that should not be done in parallel 10: } 11: } Ließe man in Zeile 7 das String.Intern(…) weg, würde bei jedem Aufruf der Methode ein neues String-Objekt generiert – was für dem Lock seine Existenzberechtigung raubt. Gruß, Oliver Technorati-Tags: Multithreading,Lock,String,Intern

Arten von Branches, Branch per Refactoring

by robert 8. December 2009 15:42

Wir hatten gerade eine Diskussion zum Nutzen von “Feature-Branches”, “Long-Running Branches” und “Topic Branches”. Das Gespräch bezog sich auf die Nutzung mit GIT. Zunächst eine kurze Klärung der Begriffe: “Feature-Branches”, für ein Feature wird eine neuer Entwicklungszweig genutzt “Branch-per-Configuration”, es wird kein physischer branch erzeugt, sondern die Entwicklung erfolgt im Hauptzweig. Ein entwickeltes Feature läst sich per Konfiguration ein und ausschalten. “Long-Running Branches”, Ein Branch der länger als ein paar Tage genutzt wird “Topic Branch”, Ein Branch der kurzlebig ist. Kurzlebig sind ein paar Minuten oder Stunden. Aus meiner Perspektive sind Feature-Branches und Long-Running-Branches - wenn möglich - zu vermeiden. Ideal ist sind “Branches per Configuration”, die bei der Entwicklung ein modulares Arbeiten und damit eine gute Architektur erzwingen. Aufwände für das mergen werden vermieden. “Topic Branches“ sind durchweg positiv, wenn sie lokal bleiben und nicht zu entfernten Repositories gepushed werden. Branch per Refactoring Es kam auch kurz das Gespräch auf das Thema “Branch per Refactoring” bzw. eine Refaktorisierung wurde als “Feature Branch” bezeichnet. Aus meiner Sicht deutet das auf einen CodeProcess-Smell hin. Die Refaktorisierung ist zu groß.  Refaktorisierungsschritte sollten klein sein und ein Arbeitsschritt direkt wieder in den Hauptentwicklungszweig einfließen können.

Benamungs-Strategien

by robert 15. November 2009 19:57

SettingsApp SettingsUser SettingsSubSystemX vs. AppSettings UserSettings SubSystemXSettings beides hat seine für und wider. Variante 1 ist IntelliSense freundlicher und Variante 2 ist näher an der Grammatik. Ich bin ich ganz klar - soweit die Wortgebilde nicht total obskur werden - meist für Variante 1.

32-bit DLL in 64-bit WebApp: An attempt was made to load a program with an incorrect format

by Oliver 30. October 2009 16:36

Die folgende Fehlermeldung erhielt ich heute von unserem IIS7, als ich Camping.Info starten wollte: Server Error in '/' Application. Could not load file or assembly 'Microsoft.Cci' or one of its dependencies. An attempt was made to load a program with an incorrect format. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Cci' or one of its dependencies. An attempt was made to load a program with an incorrect format. Also das Orakel gefragt und u.a. das hier gefunden: http://forums.asp.net/t/1358032.aspx Standardmäßig unterstützt ein 64-bittiger IIS 7 keine 32-bit-Module (u.a. DLLs). Man kann es ihm aber einfach beibringen :-) Im IIS-Manager den gewünschten ApplicationPool auswählen und in den Advanced Settings die folgende Einstellung vornehmen: Der Vollständigkeit halber hier noch ein Link zur Anleitung für den IIS6 auf Windows 2003 Server: http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/405f5bb5-87a3-43d2-8138-54b75db73aa1.mspx?mfr=true Happy Coding! Oliver

Configuration mit configSource auslagern - Copy always

by Oliver 5. September 2009 10:01

Eine kleine Notiz für die Zukunft: Wenn man eine Configuration-Section aus einer *.config-Datei in eine eigene Datei auslagert, so wie neulich geschehen für die NHibernate-Konfiguration, dann sollte man die "Copy to Output Directory"-Option auf "Copy Always" setzen: <!-- Lokal eine passende NH.config anlegen --> <hibernate-configuration configSource="NH.config" /> Ansonsten bekommt man nämlich eine der folgenden ähnliche Fehlermeldung: System.Configuration.ConfigurationErrorsException: Die configSource-Datei "NH.config" kann nicht geöffnet werden. (G:\Projects\Camping.Info\Tests\bin\Debug\Tests.dll.config line 12) Oliver

Projekt Versionierung und Buildmanagement

by robert 1. August 2009 13:54

Für unsere Projekte verwenden wir eine Versionierungsstrategie, in der es darum geht die Versionskontrolsystem-Revision (in unserem Fall SVN) zuzuordnen: Beispiel www.camping.info: Interessant für uns, ist nur der hintere Teil: 2013.214. 2013: ist die SVN Revision von www.camping.info 214: ist die SVN Revision von Speak-Lib, einer Hilfs-Bibliothek Die Version wird vor jedem deployment in die Assembly.Info.cs geschrieben, noch händisch, und so wieder ausgelesen: Assembly assembly = Assembly.GetExecutingAssembly(); ltVersion.Text = assembly.GetName().Version.ToString();   Für das Build-Mangement verwenden wir Target-Process, wobei der Buildname auch die Revision beinhaltet: Hier lässt sich sehen, dass die aktuelle Camping.Info Version (x.x.2013.214) am 30 Juil deployed wurde und zur Iteration 4.7 gehört. Noch mehr Informationen finden sich den Build-Details: Die Build-Details beinhalten alle in der Version durchgeführten Änderungen. Diese Informationen können als Info an den Kunden direkt weitergegeben werden. Mit Erwin Oberascher von www.camping.Info haben wir jedoch den Ideal-Fall, in dem der Kunde Zugriff und Interesse an solchen Projekt-Artefakten hat.

Standard-Email Programm öffnen c# & mailto:

by robert 4. June 2009 13:21

Folgender Code öffnet den “Default-Email-Client”: System.Diagnostics.Process.Start( String.Format("mailto:{0}?subject={1}&body={2}", "demo@mail.de", "Nachricht von test@test.de", "Hallo %0aNachricht %0aGrußformel"));   “%0a” erzeugt einen Zeilenumbruch.     Attachments werden nicht konsistent interpretiert und sind Email-Client Versions und Patch abhängig. “Attach” wird von Outlook 2007 aus Sicherheitsgründen nicht weiter unterstützt. Werden Attachments verbindlich benötigt ist man mit dem direkten Versand der Email auf der sicheren Seite.

Ids verketten mit CHAR-Delimiter

by Oliver 10. April 2009 18:55

Ein kleiner Fallstrick im alltäglichen Programmierleben: Wir benötigen eine Liste von Int's als String, um flexibel zu sein mit veränderbarem Trennzeichen, bevorzugt ein char. Das Ergebnis überrascht:   Natürlich muss es wie folgt heißen:   Gruß, Oliver P.S. Screenshots made by Greenshot (ein funktionsreiches Open-Source-Screenshot-Tool: http://sourceforge.net/projects/greenshot/). UPDATE: Natürlich das noch  d e u t l i c h  einfacher:   Danke, .NET :-)

About Oliver

shades-of-orange.com code blog logo I build web applications using ASP.NET and have a passion for javascript. Enjoy MVC 4 and Orchard CMS, and I do TDD whenever I can. I like clean code. Love to spend time with my wife and our children. My profile on Stack Exchange, a network of free, community-driven Q&A sites

About Anton

shades-of-orange.com code blog logo I'm a software developer at teamaton. I code in C# and work with MVC, Orchard, SpecFlow, Coypu and NHibernate. I enjoy beach volleyball, board games and Coke.