ìë°ì¤í¬ë¦½í¸ë ëì ë³´ì´ì§ ìë ê³³ìì ë©ëª¨ë¦¬ ê´ë¦¬ë¥¼ ìíí©ëë¤.
ììê°, ê°ì²´, í¨ì ë± ì°ë¦¬ê° ë§ëë 모ë ê²ì ë©ëª¨ë¦¬ë¥¼ ì°¨ì§í©ëë¤. ê·¸ë ë¤ë©´ ëë ì¸ëª¨ ìì´ì§ê² ë ê²ë¤ì ì´ë»ê² ì²ë¦¬ë ê¹ì? ì§ê¸ë¶í´ ìë°ì¤í¬ë¦½í¸ ìì§ì´ ì´ë»ê² íì ìë ê²ì ì°¾ìë´ ìì íëì§ ììë³´ê² ìµëë¤.
ê°ë¹ì§ 컬ë ì 기ì¤
ìë°ì¤í¬ë¦½í¸ë ëë¬ ê°ë¥ì±(reachability) ì´ë¼ë ê°ë ì ì¬ì©í´ ë©ëª¨ë¦¬ ê´ë¦¬ë¥¼ ìíí©ëë¤.
âëë¬ ê°ë¥í(reachable)â ê°ì ì½ê² ë§í´ ì´ë»ê²ë ì ê·¼íê±°ë ì¬ì©í ì ìë ê°ì ì미í©ëë¤. ëë¬ ê°ë¥í ê°ì ë©ëª¨ë¦¬ìì ìì ëì§ ììµëë¤.
-
ìë ìê°í´ ë릴ê°ë¤ì ê·¸ íìë¶í° ëë¬ ê°ë¥í기 ë문ì, ëª ë°±í ì´ì ìì´ë ìì ëì§ ììµëë¤.
ìì:
- íì¬ í¨ìì ì§ì ë³ìì 매ê°ë³ì
- ì¤ì²© í¨ìì ì²´ì¸ì ìë í¨ììì ì¬ì©ëë ë³ìì 매ê°ë³ì
- ì ì ë³ì
- 기í ë±ë±
ì´ë° ê°ì 루í¸(root) ë¼ê³ ë¶ë¦ ëë¤.
-
루í¸ê° 참조íë ê°ì´ë ì²´ì´ëì¼ë¡ 루í¸ìì 참조í ì ìë ê°ì ëë¬ ê°ë¥í ê°ì´ ë©ëë¤.
ì ì ë³ìì ê°ì²´ê° ì ì¥ëì´ìë¤ê³ ê°ì í´ ë´ ìë¤. ì´ ê°ì²´ì íë¡í¼í°ê° ë ë¤ë¥¸ ê°ì²´ë¥¼ 참조íê³ ìë¤ë©´, íë¡í¼í°ê° 참조íë ê°ì²´ë ëë¬ ê°ë¥í ê°ì´ ë©ëë¤. ì´ ê°ì²´ê° 참조íë ë¤ë¥¸ 모ë ê²ë¤ë ëë¬ ê°ë¥íë¤ê³ ì¬ê²¨ì§ëë¤. ìì¸í ììë ìëìì ì´í´ë³´ê² ìµëë¤.
ìë°ì¤í¬ë¦½í¸ ìì§ ë´ìì ê°ë¹ì§ 컬ë í°(garbage collector)ê° ëììì´ ëìí©ëë¤. ê°ë¹ì§ 컬ë í°ë 모ë ê°ì²´ë¥¼ 모ëí°ë§íê³ , ëë¬í ì ìë ê°ì²´ë ìì í©ëë¤.
ê°ë¨í ìì
ì주 ê°ë¨í ììê° ììµëë¤.
// userì ê°ì²´ 참조 ê°ì´ ì ì¥ë©ëë¤.
let user = {
name: "John"
};
ì´ ê·¸ë¦¼ìì íì´íë ê°ì²´ 참조를 ëíë
ëë¤. ì ì ë³ì "user"ë {name: "John"} (ì¤ì¬ì John)ì´ë¼ë ê°ì²´ë¥¼ 참조í©ëë¤. Johnì íë¡í¼í° "name"ì ììê°ì ì ì¥íê³ ì기 ë문ì ê°ì²´ ìì íííìµëë¤.
userì ê°ì ë¤ë¥¸ ê°ì¼ë¡ ë®ì´ì°ë©´ 참조(íì´í)ê° ì¬ë¼ì§ëë¤.
user = null;
ì´ì Johnì ëë¬í ì ìë ìíê° ëììµëë¤. Johnì ì ê·¼í ë°©ë²ë, Johnì 참조íë ê²ë 모ë ì¬ë¼ì¡ìµëë¤. ê°ë¹ì§ 컬ë í°ë ì´ì Johnì ì ì¥ë ë°ì´í°ë¥¼ ìì íê³ , Johnì ë©ëª¨ë¦¬ìì ìì í©ëë¤.
참조 ë ê°
참조를 userìì adminì¼ë¡ ë³µì¬íë¤ê³ ê°ì í´ë´
ìë¤.
// userì ê°ì²´ 참조 ê°ì´ ì ì¥ë©ëë¤.
let user = {
name: "John"
};
let admin = user;
ê·¸ë¦¬ê³ ììì íê² ì²ë¼ userì ê°ì ë¤ë¥¸ ê°ì¼ë¡ ë®ì´ì¨ ë´
ìë¤.
user = null;
ì ì ë³ì adminì íµíë©´ ì¬ì í ê°ì²´ Johnì ì ê·¼í ì ì기 ë문ì Johnì ë©ëª¨ë¦¬ìì ìì ëì§ ììµëë¤. ì´ ìíìì adminì ë¤ë¥¸ ê°(null ë±)ì¼ë¡ ë®ì´ì°ë©´ Johnì ë©ëª¨ë¦¬ìì ìì ë ì ììµëë¤.
ì°ê²°ë ê°ì²´
ì´ì ê°ì¡±ê´ê³ë¥¼ ëíë´ë ë³µì¡í ìì를 ì´í´ë³´ê² ìµëë¤.
function marry(man, woman) {
woman.husband = man;
man.wife = woman;
return {
father: man,
mother: woman
}
}
let family = marry({
name: "John"
}, {
name: "Ann"
});
í¨ì marry(ê²°í¼íë¤)ë 매ê°ë³ìë¡ ë°ì ë ê°ì²´ë¥¼ ìë¡ ì°¸ì¡°íê² íë©´ì 'ê²°í¼âìí¤ê³ , ë ê°ì²´ë¥¼ í¬í¨íë ìë¡ì´ ê°ì²´ë¥¼ ë°íí©ëë¤.
ë©ëª¨ë¦¬ 구조ë ìëì ê°ì´ ëíë¼ ì ììµëë¤.
ì§ê¸ì 모ë ê°ì²´ê° ëë¬ ê°ë¥í ìíì ëë¤.
ì´ì 참조 ë ê°ë¥¼ ì§ìë³´ê² ìµëë¤.
delete family.father;
delete family.mother.husband;
ìì í ë ê°ì 참조 ì¤ íëë§ ì§ì ë¤ë©´, 모ë ê°ì²´ê° ì¬ì í ëë¬ ê°ë¥í ìíìì ê²ëë¤.
íì§ë§ 참조 ë ê°ë¥¼ ì§ì°ë©´ Johnì¼ë¡ ë¤ì´ì¤ë 참조(íì´í)ë 모ë ì¬ë¼ì ¸ Johnì ëë¬ ê°ë¥í ìíìì ë²ì´ë©ëë¤.
ì¸ë¶ë¡ ëê°ë 참조ë ëë¬ ê°ë¥í ìíì ìí¥ì ì£¼ì§ ììµëë¤. ì¸ë¶ìì ë¤ì´ì¤ë 참조ë§ì´ ëë¬ ê°ë¥í ìíì ìí¥ì ì¤ëë¤. Johnì ì´ì ëë¬ ê°ë¥í ìíê° ìë기 ë문ì ë©ëª¨ë¦¬ìì ì ê±°ë©ëë¤. Johnì ì ì¥ë ë°ì´í°(íë¡í¼í°) ìì ë©ëª¨ë¦¬ìì ì¬ë¼ì§ëë¤.
ê°ë¹ì§ 컬ë ì í ë©ëª¨ë¦¬ 구조ë ìëì ê°ìµëë¤.
ëë¬í ì ìë ì¬
ê°ì²´ë¤ì´ ì°ê²°ëì´ ì¬ ê°ì 구조를 ë§ëëë°, ì´ ì¬ì ëë¬í ë°©ë²ì´ ìë ê²½ì°, ì¬ì 구ì±íë ê°ì²´ ì ë¶ê° ë©ëª¨ë¦¬ìì ìì ë©ëë¤.
ê·¼ì ê°ì²´ familyê° ì무ê²ë 참조íì§ ìëë¡ í´ ë´
ìë¤.
family = null;
ì´ì ë©ëª¨ë¦¬ ë´ë¶ ìíë ë¤ìê³¼ ê°ìì§ëë¤.
ëë¬í ì ìë ì¬ ìì ë ëë¬ ê°ë¥ì±ì´ë¼ë ê°ë ì´ ì¼ë§ë ì¤ìíì§ ë³´ì¬ì¤ëë¤.
Johnê³¼ Annì ì¬ì í ìë¡ë¥¼ 참조íê³ ìê³ , ë ê°ì²´ 모ë ì¸ë¶ìì ë¤ì´ì¤ë 참조를 ê°ê³ ìì§ë§, ì´ê²ë§ì¼ë¡ë ì¶©ë¶íì§ ìë¤ë걸 ë³´ì¬ì£¼ì£ .
"family" ê°ì²´ì 루í¸ì ì°ê²°ì´ ì¬ë¼ì§ë©´ ë£¨í¸ ê°ì²´ë¥¼ 참조íë ê²ì´ ì무ê²ë ìê² ë©ëë¤. ì¬ ì ì²´ê° ëë¬í ì ìë ìíê° ëê³ , ì¬ì 구ì±íë ê°ì²´ ì ë¶ê° ë©ëª¨ë¦¬ìì ì ê±°ëì£ .
ë´ë¶ ìê³ ë¦¬ì¦
'mark-and-sweepâì´ë¼ ë¶ë¦¬ë ê°ë¹ì§ 컬ë ì 기본 ìê³ ë¦¬ì¦ì ëí´ ììë´ ìë¤.
'ê°ë¹ì§ 컬ë ì âì ëê° ë¤ì ë¨ê³ë¥¼ ê±°ì³ ìíë©ëë¤.
- ê°ë¹ì§ 컬ë í°ë 루í¸(root) ì 보를 ìì§íê³ ì´ë¥¼ âmark(기ìµ)â í©ëë¤.
- 루í¸ê° 참조íê³ ìë 모ë ê°ì²´ë¥¼ 방문íê³ ì´ê²ë¤ì âmarkâ í©ëë¤.
- mark ë 모ë ê°ì²´ì 방문íê³ ê·¸ ê°ì²´ë¤ì´ 참조íë ê°ì²´ë mark í©ëë¤. íë² ë°©ë¬¸í ê°ì²´ë ì ë¶ mark í기 ë문ì ê°ì ê°ì²´ë¥¼ ë¤ì 방문íë ì¼ì ììµëë¤.
- 루í¸ìì ëë¬ ê°ë¥í 모ë ê°ì²´ë¥¼ 방문í ëê¹ì§ ì ê³¼ì ì ë°ë³µí©ëë¤.
- mark ëì§ ìì 모ë ê°ì²´ë¥¼ ë©ëª¨ë¦¬ìì ìì í©ëë¤.
ë¤ìê³¼ ê°ì ê°ì²´ êµ¬ì¡°ê° ìë¤ê³ í´ë´ ìë¤.
ì¤ë¥¸í¸ì 'ëë¬í ì ìë ì¬âì´ ë³´ì´ë¤ì. ì´ì ê°ë¹ì§ 컬ë í°ì âmark-and-sweepâ ìê³ ë¦¬ì¦ì´ ì´ê²ì ì´ë»ê² ì²ë¦¬íëì§ ë´ ìë¤.
첫 ë²ì§¸ ë¨ê³ìì 루í¸ë¥¼ mark í©ëë¤.
ì´í 루í¸ê° 참조íê³ ìë ê²ë¤ì mark í©ëë¤.
ëë¬ ê°ë¥í 모ë ê°ì²´ë¥¼ 방문í ëê¹ì§, mark í ê°ì²´ê° 참조íë ê°ì²´ë¥¼ ê³ìí´ì mark í©ëë¤.
방문í ì ììë ê°ì²´ë¥¼ ë©ëª¨ë¦¬ìì ìì í©ëë¤.
루í¸ìì íì¸í¸ë¥¼ ë¤ì´ë¶ëë¤ê³ ììíë©´ ì´ ê³¼ì ì ì´í´í기 ì½ìµëë¤. 루í¸ë¥¼ ììì¼ë¡ 참조를 ë°ë¼ê°ë©´ì ëë¬ê°ë¥í ê°ì²´ 모ëì íì¸í¸ê° ì¹ í´ì§ë¤ê³ ìê°íë©´ ë©ëë¤. ì´ë íì¸í¸ê° ë¬»ì§ ìì ê°ì²´ë ë©ëª¨ë¦¬ìì ìì ë©ëë¤.
ì§ê¸ê¹ì§ ê°ë¹ì§ 컬ë ì ì´ ì´ë»ê² ëìíëì§ì ëí ê°ë ì ììë³´ììµëë¤. ìë°ì¤í¬ë¦½í¸ ìì§ì ì¤íì ìí¥ì 미ì¹ì§ ìì¼ë©´ì ê°ë¹ì§ 컬ë ì ì ë ë¹ ë¥´ê² íë ë¤ìí ìµì í 기ë²ì ì ì©í©ëë¤.
ìµì í 기ë²:
- generational collection(ì¸ëë³ ìì§) â ê°ì²´ë¥¼ 'ìë¡ì´ ê°ì²´âì 'ì¤ëë ê°ì²´âë¡ ëëëë¤. ê°ì²´ ìë¹ìë ìì± ì´í ì ìí ì ë¹ ë¥´ê² ìíí´ ê¸ë°© ì¸ëª¨ê° ìì´ì§ëë°, ì´ë° ê°ì²´ë¥¼ 'ìë¡ì´ ê°ì²´âë¡ êµ¬ë¶í©ëë¤. ê°ë¹ì§ 컬ë í°ë ì´ë° ê°ì²´ë¥¼ 공격ì ì¼ë¡ ë©ëª¨ë¦¬ìì ì ê±°í©ëë¤. ì¼ì ìê° ì´ì ëì ì´ìë¨ì ê°ì²´ë 'ì¤ëë ê°ì²´âë¡ ë¶ë¥íê³ , ê°ë¹ì§ 컬ë í°ê° ë ê°ìí©ëë¤.
- incremental collection(ì ì§ì ìì§) â 방문í´ì¼ í ê°ì²´ê° ë§ë¤ë©´ 모ë ê°ì²´ë¥¼ í ë²ì 방문íê³ mark íëë° ìë¹í ìê°ì´ ì모ë©ëë¤. ê°ë¹ì§ 컬ë ì ì ë§ì 리ìì¤ê° ì¬ì©ëì´ ì¤í ìëë ëì ëê² ëë ¤ì§ê² ì£ . ìë°ì¤í¬ë¦½í¸ ìì§ì ì´ë° íìì ê°ì í기 ìí´ ê°ë¹ì§ 컬ë ì ì ì¬ë¬ ë¶ë¶ì¼ë¡ ë¶ë¦¬í ë¤ì, ê° ë¶ë¶ì ë³ëë¡ ìíí©ëë¤. ìì ì ë¶ë¦¬íê³ , ë³ê²½ ì¬íì ì¶ì íë ë° ì¶ê° ìì ì´ íìí긴 íì§ë§, 긴 ì§ì°ì ì§§ì ì§ì° ì¬ë¬ ê°ë¡ ë¶ì°ìí¬ ì ìë¤ë ì¥ì ì´ ììµëë¤.
- idle-time collection(ì í´ ìê° ìì§) â ê°ë¹ì§ 컬ë í°ë ì¤íì 주ë ìí¥ì ìµìíí기 ìí´ CPUê° ì í´ ìíì¼ ëìë§ ê°ë¹ì§ 컬ë ì ì ì¤íí©ëë¤.
ì´ ì¸ìë ë¤ìí ìµì í 기ë²ê³¼ ê°ë¹ì§ 컬ë ì ìê³ ë¦¬ì¦ì´ ììµëë¤. ë¤ìí 기ë²ê³¼ ìê³ ë¦¬ì¦ì ìê°í´ ëë¦¬ê³ ì¶ì§ë§, ìì§ë§ë¤ ì¸ë¶ ì¬íì´ë 기ë²ì´ ë¤ë¥´ê¸° ë문ì ì¬ê¸°ì ë©ì¶ëë¡ íê² ìµëë¤. ìì§ì´ ë°ì íë©´ 기ë²ë ë¬ë¼ì§ê¸° ë문ì íìµí´ì¼ í ì´ì ê° ì§ì§ ìë¤ë©´ âì¬íâ íìµì 그리 ê°ì¹ ìì§ ìë¤ê³ ìê°í©ëë¤. ììí í¸ê¸°ì¬ ë문ì´ë¼ë©´ ë¬¼ë¡ ê´ì°®ìµëë¤. ì´ë° ë¶ë¤ì ìí´ ìëì ë§í¬ë¥¼ ëª ê°ë¥¼ ìê°í´ëììµëë¤.
ìì½
ì§ê¸ê¹ì§ ìì본 ë´ì©ì ìì½í´ ë´ ìë¤.
- ê°ë¹ì§ 컬ë ì ì ìì§ì´ ìëì¼ë¡ ìííë¯ë¡ ê°ë°ìë ì´ë¥¼ ìµì§ë¡ ì¤ííê±°ë ë§ì ì ììµëë¤.
- ê°ì²´ë ëë¬ ê°ë¥í ìíì¼ ë ë©ëª¨ë¦¬ì ë¨ìµëë¤.
- 참조ëë¤ê³ í´ì ëë¬ ê°ë¥í ê²ì ìëëë¤. ìë¡ ì°ê²°ë ê°ì²´ë¤ë ëë¬ ë¶ê°ë¥í ì ììµëë¤.
모ë ìë°ì¤í¬ë¦½í¸ ìì§ì ì¢ ë ë°ì ë ê°ë¹ì§ 컬ë ì ìê³ ë¦¬ì¦ì ì¬ì©í©ëë¤.
ì´ë¤ ìê³ ë¦¬ì¦ì ì¬ì©íëì§ ê¶ê¸íë¤ë©´ âThe Garbage Collection Handbook: The Art of Automatic Memory Managementâ(ì ì â R. Jones et al)를 ì°¸ê³ íì기 ë°ëëë¤.
ì ìì¤(low-level) íë¡ê·¸ëë°ì ìµìíë¤ë©´, A tour of V8: Garbage Collectionì ì½ì´ë³´ì¸ì. V8 ê°ë¹ì§ 컬ë í°ì ëí ìì¸í ë´ì©ì íì¸í´ ë³¼ ì ììµëë¤.
V8 ê³µì ë¸ë¡ê·¸ìë ë©ëª¨ë¦¬ ê´ë¦¬ ë°©ë² ë³íì ëí ë´ì©ì´ ì¬ë¼ìµëë¤. ê°ë¹ì§ 컬ë ì ì ì¬ë ìê² íìµíë ¤ë©´ V8 ë´ë¶êµ¬ì¡°ë¥¼ ê³µë¶íê±°ë V8 ìì§ëì´ë¡ ì¼íë Vyacheslav Egorovì ë¸ë¡ê·¸ë¥¼ ì½ë ê²ë ì¢ìµëë¤. ì¬ë¬ ìì§ ì¤ âV8â ìì§ì ì¸ê¸íë ì´ì ë ì¸í°ë·ìì ê´ë ¨ ê¸ì ì½ê² ì°¾ì ì ì기 ë문ì ëë¤. V8ê³¼ í ìì§ë¤ì ëì ë°©ë²ì´ ë¹ì·íë°, ê°ë¹ì§ 컬ë ì ëì ë°©ììë ë§ì ì°¨ì´ê° ììµëë¤.
ì ìì¤ ìµì íê° íìí ìí©ì´ë¼ë©´, ìì§ì ëí ì¡°ìê° ê¹ì´ì¼ í©ëë¤. 먼ì ìë°ì¤í¬ë¦½í¸ì ìµìí´ì§ íì ìì§ì ëí´ íìµíë ê²ì ì¶ì²í´ ë립ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.