Memory Management¶
Genel Bakış¶
C#'ta bellek yönetimi, .NET CLR (Common Language Runtime) tarafından otomatik olarak yapılır. Bu sistem, geliştiricilerin bellek yönetimiyle ilgili detaylarla uğraşmasını engelleyerek, daha güvenli ve verimli kod yazılmasını sağlar.
Stack ve Heap¶
-
Stack (Yığın)
// Stack'te saklanan değerler int number = 42; // Value type double pi = 3.14; // Value type bool isTrue = true; // Value type // Method çağrıları void Method() { int localVar = 10; // Stack'te saklanır }
-
Heap (Yığın)
// Heap'te saklanan nesneler string name = "Ahmet"; // Reference type Person person = new Person(); // Reference type int[] numbers = new int[10]; // Reference type
Garbage Collection (Çöp Toplama)¶
-
GC Temelleri
// Nesne oluşturma Person person = new Person(); // Referansı kaldırma person = null; // GC tarafından toplanabilir
-
GC Generations
// Generation 0 - Yeni nesneler var obj1 = new object(); // Generation 1 - Hayatta kalan nesneler GC.Collect(0); // Generation 0 temizlenir // Generation 2 - Uzun süreli nesneler GC.Collect(1); // Generation 1 temizlenir
IDisposable ve Dispose Pattern¶
-
Temel Dispose Pattern
public class Resource : IDisposable { private bool disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { // Yönetilen kaynakları serbest bırak } // Yönetilmeyen kaynakları serbest bırak disposed = true; } } ~Resource() { Dispose(false); } }
-
using Statement
using (var resource = new Resource()) { // Kaynak kullanımı } // Otomatik olarak Dispose çağrılır
Memory Leaks (Bellek Sızıntıları)¶
-
Event Handlers
// Bellek sızıntısı örneği public class Publisher { public event EventHandler SomethingHappened; } public class Subscriber { public void Subscribe(Publisher publisher) { publisher.SomethingHappened += OnSomethingHappened; } private void OnSomethingHappened(object sender, EventArgs e) { // Event handler } }
-
Static References
// Statik referans örneği public static class Cache { private static List<object> items = new List<object>(); public static void Add(object item) { items.Add(item); } }
Memory Management Best Practices¶
-
Value vs Reference Types
// Value type kullanımı (küçük, değişmez veriler için) public struct Point { public int X { get; } public int Y { get; } } // Reference type kullanımı (karmaşık, değişebilir veriler için) public class Person { public string Name { get; set; } public List<string> Addresses { get; set; } }
-
String Handling
// String birleştirme string result = string.Concat("Hello", " ", "World"); // StringBuilder kullanımı var builder = new StringBuilder(); builder.Append("Hello"); builder.Append(" "); builder.Append("World"); string result = builder.ToString();
Memory Profiling¶
-
Memory Profiler Kullanımı
// Memory snapshot alma var snapshot1 = GC.GetTotalMemory(false); // İşlemler var list = new List<int>(); for (int i = 0; i < 1000000; i++) { list.Add(i); } var snapshot2 = GC.GetTotalMemory(false); var memoryUsed = snapshot2 - snapshot1;
-
Weak References
// Weak reference kullanımı var weakRef = new WeakReference(new object()); if (weakRef.IsAlive) { var target = weakRef.Target; }
Mülakat Soruları¶
- Bellek Yönetimi Temelleri
- Stack ve Heap arasındaki farklar nelerdir?
- Value type ve Reference type'lar bellekte nasıl saklanır?
-
Garbage Collection nasıl çalışır?
-
Garbage Collection
- GC Generations nedir ve nasıl çalışır?
- GC ne zaman tetiklenir?
-
GC'nin performans etkileri nelerdir?
-
IDisposable Pattern
- Dispose pattern nedir ve neden kullanılır?
- using statement nasıl çalışır?
-
Finalizer ne zaman kullanılmalıdır?
-
Memory Leaks
- Bellek sızıntıları nasıl oluşur?
- Event handler'lar nasıl bellek sızıntısına neden olur?
-
Statik referansların riskleri nelerdir?
-
Value vs Reference Types
- Value type ve Reference type ne zaman kullanılmalıdır?
- Struct ve Class arasındaki bellek yönetimi farkları nelerdir?
-
Boxing/Unboxing'in bellek etkileri nelerdir?
-
String Handling
- String immutability nedir?
- StringBuilder ne zaman kullanılmalıdır?
-
String interning nedir?
-
Memory Profiling
- Memory profiler nasıl kullanılır?
- Weak references ne işe yarar?
-
Memory snapshot'lar nasıl analiz edilir?
-
Best Practices
- Bellek yönetimi için en iyi uygulamalar nelerdir?
- Büyük nesneler nasıl yönetilmelidir?
- Bellek fragmentasyonu nasıl önlenir?
Örnek Kod Soruları¶
-
Memory Efficient Cache
public class MemoryEfficientCache<TKey, TValue> { // Implementasyon }
-
Resource Manager
public class ResourceManager : IDisposable { // Implementasyon }
-
Memory Monitor
public class MemoryMonitor { // Implementasyon }
-
Weak Reference Cache
public class WeakReferenceCache<T> { // Implementasyon }
-
Memory Optimized Collection
public class MemoryOptimizedCollection<T> { // Implementasyon }