Garbage Collection - Zelf aanroepem met GC.Collect() - Wanneer? - Nooit aanroepen - Nooit over nadenken - Waarom? - Testen - Rommel programma's die tijdcritisch zijn - Problemen met geheugen - GC op ongewenste momenten - Wanneer komt die langs? - Wanneer het geheugen vol is - Geheugen vol na garbage collection = OutOfMemoryException - GC draait in eigen core - Ruimt op in periodieke intervals - Hoe? - Objecten hebben een GC bitje die wordt gezet als het object geen garbage is - Bepaalt zelf hoe de GC plaatsvindt - 1. Reachability/Tracing Garbage Collector - Kijkt welke objecten nog bereikbaar zijn vanaf de stack - Kijkt welke objecten nog bereikbaar zijn vanaf static's (eigen geheugen) - Kijkt welke objecten nog bereikbaar zijn vanaf registers - 2. Compacting Garbage Collector - Heap aanstampen. Schuift alle objecten naar boven toe - 3. Objecten met een finalizer komen oop in de Finalization Queue - Wanneer de GC langskomt worden alle niet-gebruikte objecten in de Finalization Queue naar de FReachable Queue verplaatst - 4. Finalize wordt aangeroepen als het object in de FReachable Queue staat - Pas na een tijdje, dus nadeel - Objecten met destructor overleven een GC slag omdat de finalize nog uitgevoerd moet worden - Wanneer finalize aangeroepen is, wordt het object ge-garbage collect - Don'ts - p = null; om garbage te maken - Compiler optimization - Voegt p = null toe, wanneer p niet meer gebruikt wordt - Aan te zetten in release mode - Generaties - Sommige objecten leven lang en sommige leven kort - Objecten die de Garbage Collection overleefd hebben komen in generatie 1 - Alleen generatie 0 wordt aangestampt - Weinig aanstampwerk want de meeste dingen zijn garbage - Na 2 generatie 0 GC's wordt er een generatie 1 GC gedaan. - Alle objecten die dit overleven worden generatie 2 - Generatie volgorde - 0,0,1,0,0,1,0,0,2 - Reference counting Garbage Collector - Telt references - Wordt niet meer gebruikt - Unmanaged resource - Wordt niet vanzelf opgeruimd - class FileStream - public FileStream (..) - ~ FileStream () - Ook wel - Destructor - Finalizer - Laatste wil - Onder water - protected override void Finalize() - Files - Heap grootste t.o.v. stack - Stacks van alle threads - Vooraf ingestelde grootte - Bijvoorbeeld 2gb of 4gb - Static niet goed omdat - Oneindig lang in geheugen - Moeilijk testbaar want niet te mocken - Meestal niet nodig - Weak references - Wat is het? - new WeakReference (P) - Als de garbage collector langskomt mag het object weggegooid worden - Wat heb je eraan? - Document van 1GB - Misschien nog eens nodig, misschien niet - Als het geheugen nodig is, mag het weg - Misschien toch nodig, dus dan is het handig als het er nog staat Pointers - 1. Freepointer wijst naar de eerst vrije plek in het geheugen - 2. Er wordt ruimte gereserveerd voor person - 3. Ruimte vullen met 0's - 4. Freepointer updaten - 5. Pointer op de stack naar het persoon object IDisposable - public void Dispose() - Destructor is een vangnet. Liever Dispose() gebruiken - Destructor niet altijd nodig - Class kan zelf geen unmanaged resources hebben, maar superclasses wel - Dispose en destructor dezelfde protected virtual void laten gebruiken - protected virtual void Dispose (bool deProgrammeurDeedHet) - True: alle componenten ook opruimen - Dispose (true); GC.SuppressFinalize(this) - Wanneer de programmeur zelf disposed, kan er tegen de GC gezegd worden dat we al opgeruimd zijn - private bool _disposed = false - Geeft aan of we al opgeruimd zijn - ALTIJD using gebruiken om disposable resource heen - Behalve wanneer de disposable class een property is van een andere class - De andere class dient IDisposable te implementeren en de dispose aan te roepen van de disposable properties - Bij het aanroepen van de dispose, wordt de property gecast naar IDisposable - IDisposable kan expliciet geimplementeerd zijn - Behalve wanneer de disposable resource geinjecteerd wordt - De injector is verantwoordelijk voor het opruimen omdat deze er nog andere dingen mee zou kunnen doen File I/O - Files benaderen kan met 2 classes - File (statics) - Wat? - Open (..) - Move (..) - Delete (..) - Wanneer? - Steeds opnieuw kijken welke rechten een file heeft - Soms een file openen - FileInfo (instance) - Wat? - Open (..) - Move (..) - Delete (..) - Wanneer? - Wanneer je info over een file wil opvragen - Wanneer je door een directory heen wil lopen - Tool die veel met files of directories doet File system watcher - Oog op directory - Event wanneer er een file gecreerd wordt - Listener op de OS laag - File aanmaken geeft een event af op de OS laag die doorgegeven wordt aan de applicatie - Events draaien op OS thread - Voor iedere event wordt er een thread aangemaakt - Ook als de events niet belangrijk zijn - Van kernel mode naar user mode - Processor kan draaien in kernel mode of user mode - Kernel meer gehuegen dan user mode - Kernel mag meer dingen - Kernel meer api's dan user mode - Filter op OS niveau zodat niet alle events doorgegeven worden - Hoe? - var watcher = new FileSystemWatcher(path); - watcher.Filter = "*.txt"; - watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size; - watcher.EnableRaisingEvents = true; Streams - Soorten streams - System.Stream - FileStream - 1010101 die uit een file komt - Bij Write wordt deze byte[] in de file gestopt - Bij Read wordt de lege byte[] gevuld met de file content - NetworkStream - MemoryStream - GZipStream - Kan om andere streams heen - Methodes als - Write (byte[]) - Read (byte[]) - Content wordt verkleind bij schrijven en vergroot bij lezen - CryptoStream - Kan om andere streams heen - Methodes als - Write (byte[]) - Read (byte[]) - Content wordt ge-encrypt of ge-decrypt