Çöp toplama
- İngilizcesi
- Garbage Collection
- Okunuşu
- garbıc kılekşın
Günlük kullanımda iki ad da yaygın.
Kısaca
Çöp toplama, dil çalışma zamanının programın artık kullanamadığı verileri bulup bu belleği yeniden kullanıma açtığı otomatik bellek yönetimidir.
Çöp toplama (garbage collection) nedir?
Bir programın oluşturduğu her değer, kısa bir dizeden büyük bir nesneye dek bellekte yer kaplar. Çöp toplama, bir dilin çalışma zamanının artık ihtiyaç duyulmayan değerleri otomatik olarak bulup belleklerini geri kazandığı süreçtir. JavaScript, Java, C#, Python ve Go gibi diller bir çöp toplayıcı kullanır; bu yüzden geliştiricilerin belleği elle serbest bırakması nadiren gerekir.
Çoğu çöp toplayıcı erişilebilirlik (reachability) ilkesiyle çalışır. Global değişkenler ve o anda çalışan fonksiyonların değişkenleri gibi köklerden başlayarak toplayıcı, programın hâlâ ulaşabildiği tüm nesneleri bulmak için her referansı izler; ulaşamadığı her şey çöp sayılır. İşaretle ve süpür (mark-and-sweep) adı verilen bu yaklaşım genellikle, nesnelerin çoğu yalnızca kısa süre gerektiği için yeni nesneleri daha sık denetleyen nesil tabanlı toplamayla birleştirilir.
Çöp toplayıcı, kimsenin kullanmadığı her şeyi kaldıran bir ofis temizlik ekibi gibidir. Çalışanlar çöp çıkarmak yerine işlerine odaklanabilir, ancak ekip işini yapmak için zaman zaman faaliyeti durdurmak zorunda kalır. Aynı şekilde çöp toplama duraklamaları kısa yavaşlamalara yol açabilir; bu yüzden oyunlar ve gecikmeye duyarlı diğer sistemler toplayıcılarını dikkatle ayarlar.
Çöp toplama çoğu zaman, geliştiricilerin free gibi fonksiyonları kendilerinin çağırdığı ve yanlış yaparlarsa çökme ve güvenlik hatası riskine girdiği C ve C++ gibi dillerdeki elle bellek yönetimiyle karşılaştırılır. Rust, çöp toplayıcı olmadan belleği serbest bırakmak için derleyicinin denetlediği sahiplik kurallarını kullanan üçüncü bir yaklaşım benimser. Çöp toplama her bellek sızıntısını da önlemez: kodunuz sürekli büyüyen bir önbellekte ya da hiç kaldırılmayan bir olay dinleyicisinde olduğu gibi artık ihtiyaç duymadığı verilere referans tutmaya devam ederse, bu veri hiçbir zaman toplanamaz.
Bir bakışta
Önemli noktalar
- Çöp toplama, programın artık ulaşamadığı belleği otomatik olarak serbest bırakır.
- Çoğu toplayıcı referansları köklerden izler; ulaşılamayan nesneler çöptür.
- Birçok bellek hatasını önler ama kısa duraklamalara ve ek bellek yüküne yol açabilir.
- Kod artık ihtiyaç duymadığı referansları tutmaya devam ederse bellek sızıntıları yine de olur.
Örnek
let user = { name: "Ada", scores: new Array(1_000_000).fill(0) };
let admin = user; // a second reference to the same object
user = null; // still reachable through admin, so it stays in memory
admin = null; // now unreachable: the garbage collector can free it
// A common leak: a cache that only ever grows
const cache = new Map();
function remember(key, value) {
cache.set(key, value); // entries stay reachable forever
}
// A WeakMap holds keys weakly, so entries vanish once a key is unreachable
const metadata = new WeakMap();Sık sorulan sorular
Hangi diller çöp toplama kullanır?
JavaScript, Java, C#, Python, Go, Ruby ve Kotlin dahil çoğu modern üst seviyeli dil kullanır. C ve C++ elle bellek yönetimine dayanır; Rust ise çalışma zamanı toplayıcısı yerine derleme zamanı sahiplik kurallarıyla belleği otomatik olarak serbest bırakır.
Çöp toplama varken bellek sızıntısı olabilir mi?
Evet. Çöp toplayıcı yalnızca erişilemeyen belleği serbest bırakır; bu yüzden örneğin bir global değişken, sürekli büyüyen bir önbellek ya da hiç kaldırılmayan bir olay dinleyicisi tarafından hâlâ referans verilen nesneler, program onları bir daha kullanmayacak olsa bile bellekte kalır.
JavaScript'te çöp toplamayı zorlayabilir miyim?
Normal kodda hayır, çünkü çöpün ne zaman toplanacağına motor karar verir. Node.js, --expose-gc bayrağıyla başlatıldığında bir global.gc() fonksiyonu sunabilir, ancak bu üretimde kullanım için değil, hata ayıklama ve test içindir.
İlgili sayfalar
- DeğişkenProgramlamanın Temelleri, s. 10Değişken, bir programda sayı ya da metin gibi bir değeri tutan ve kodun çalışırken okuyup değiştirebildiği, adlandırılmış bir depolama alanıdır.
- ClosureProgramlamanın Temelleri, s. 6Closure, oluşturulduğu kapsamdaki değişkenleri hatırlayan bir fonksiyondur; dıştaki fonksiyon sona erdikten sonra bile bu değişkenleri kullanabilir.
- DerleyiciProgramlamanın Temelleri, s. 12Derleyici, bir programlama dilinde yazılmış kaynak kodu, bilgisayarın çalıştırabileceği makine kodu gibi daha alt seviyeli bir biçime çeviren programdır.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- Node.jsBackend ve API'ler, s. 31Node.js, JavaScript'i tarayıcı dışında çalıştıran, en çok web sunucuları, API'ler ve komut satırı araçları için kullanılan açık kaynaklı çalışma ortamıdır.
- Heap Belleğiİşletim Sistemleri, s. 13Heap belleği, boyutu ya da ömrü önceden bilinmeyen, çalışma zamanında ayrılan ve onu oluşturan fonksiyondan uzun yaşayabilen verilerin tutulduğu bölgedir.
- JVMProgramlama Dilleri, s. 17JVM, Java bytecode'unu çalıştırır; böylece derlenmiş bir program her işletim sisteminde çalışır. Kotlin, Scala ve Clojure da bu bytecode'a derlenir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin