Node.js
Mark-sweep
Mark-sweep ve Mark-compact algoritmalarını öğrenirsin.
Mark-sweep
Mark-sweep, old kuşak için kullanılan çöp toplama algoritmasıdır. İki adımdan oluşur: mark (işaretle) — köklerden başlayarak ulaşılabilen nesneleri işaretler; sweep (süpür) — işaretlenmemiş nesneleri siler. Bu, döngüsel başvuruları da doğru ele alır.
Bir markSweep(roots, allObjects) fonksiyonu bunu modeller: roots'tan ulaşılabilen nesneleri bulur, geri kalanı atar. new Set(roots) ile ulaşılabilir kümesi oluşturulur; allObjects.filter(o => reachable.has(o)) ile yalnızca ulaşılabilenler kalır. Örnek: markSweep(['a', 'b'], ['a', 'b', 'c', 'd']) 'a,b' döndürür. c ve d ulaşılamaz; silinir. Bu model, mark-sweep'in işleyişini deterministik bir filtreyle gösterir.
Ulaşılabilir kümesi
Mark-sweep'in özü, bir nesnenin köklerden ulaşılabilir olup olmadığını denetlemektir. new Set(roots) ile ulaşılabilir kümesi oluşturulur. reachable.has(o) ile bir nesnenin kümede olup olmadığı anlaşılır. Bu, mark adımının basit bir modelidir.
Örnek: const reachable = new Set(['a', 'b']). reachable.has('a') true, reachable.has('c') false. allObjects.filter(o => reachable.has(o)) yalnızca ['a', 'b'] tutar. .join(',') ile 'a,b' dizesi elde edilir. Bu, mark-sweep'in hangi nesnelerin yaşayacağını nasıl belirlediğini gösterir: köklerden ulaşılabilenler yaşar, geri kalanlar süpürülür. Çıktı a,b olur.
Uygulama Mark-sweep fonksiyonu yaz
function markSweep(roots, allObjects) yaz. const reachable = new Set(roots) tanımla. return allObjects.filter(o => reachable.has(o)).join(',') ile döndür. console.log(markSweep(['a', 'b'], ['a', 'b', 'c', 'd'])) yazdır.
Örnek çözümü göster
function markSweep(roots, allObjects) {
const reachable = new Set(roots);
return allObjects.filter(o => reachable.has(o)).join(',');
}
console.log(markSweep(['a', 'b'], ['a', 'b', 'c', 'd']));
Kendini test et
-
Kavramı açıklamasına eşle
- Mark
- Ulaşılabileni işaretler
- Sweep
- İşaretsizi siler
- Roots
- Başlangıç noktaları
- Set
- Küme veri yapısı
-
markSweep(['a'], ['a','b','c']) ne döndürür?
markSweep(['a'], ['a','b','c'])
Cevabı göster
'a' — Yalnızca 'a' kökten ulaşılabilendir; 'b' ve 'c' süpürülür.
-
filter çağrısını tamamla
return allObjects.____(o => reachable.has(o)).join(',');
Cevabı göster
return allObjects.filter(o => reachable.has(o)).join(',');
Sıradaki ders: Memory leak