[[Tableofcontents]] == Contents == * GC ì˜ ê°œìš” * JSC(WebKit) ì˜ GC 구현 * 메모리 누수 사례 == Garbage Collector == * 메모리 관리를 ëŸ°íƒ€ìž„ì— ìžë™ìœ¼ë¡œ 해주는 시스템 * ìµœì´ˆì˜ êµ¬í˜„ì€ 1958 ë…„ë„ LISP == GC vs Manual == * í”„ë¡œê·¸ëž˜ë¨¸ì˜ ìƒì‚°ì„± * í”„ë¡œê·¸ëž¨ì˜ íš¨ìœ¨ì„± * 메모리 관리ìžì˜ 처리량 + ì •ì§€ 시간 * 공간 오버헤드 => 연구 결과를 통해서 성능차ì´ê°€ 없는 ê²ƒì„ ì¦ëª…했다. (단, 메모리를 5ë°° ì •ë„ ë” ì¤„ ë•Œ) => ë³´í†µì˜ ê²½ìš° 17%ì˜ ì˜¤ë²„í—¤ë“œê°€ 있다. => Manual 하게 í• ë•Œë„ ì˜¤ë²„í—¤ë“œëŠ” 있다. == Definitions == * Heap 프로그램 사용 ì˜ì— * Roots javascript ë¡œ 따지면 windows ê°™ì€ ê²ƒ, ì ˆëŒ€ë¡œ í•´ì œê°€ 안ë 것, global하게 노출ë˜ì–´ 있는 것 * Collector * Mutators == Object Liveness == * Dead : ì•ˆì“°ê³ ìžˆëŠ” 메모리 * Live : ì‚¬ìš©í•˜ê³ ìžˆëŠ” 메모리 * True liveness => ì‹¤ì œë¡œ íŒë³„하기 굉장히 ì–´ë ¤ì›€ * Pointer reachability => ëŒ€ë¶€ë¶„ì˜ ê²½ìš° ì´ ë°©ì‹ == Mark-Sweep GC == * ê°„ì ‘ì ì¸ GC ì•Œê³ ë¦¬ì¦˜ * Dead 오브ì 트가 ì•„ë‹Œ Live 오브ì íŠ¸ë“¤ì„ ëª¨ë‘ ì¶”ì * 나머지 Garbage ë¡œ ê²°ì • * JSC ì—ì„œë„ ì´ ì•Œê³ ë¦¬ì¦˜ì„ ì‚¬ìš© * 메모리를 ë§Žì´ ì“¸ ìˆ˜ë¡ ëŠë ¤ì§ => 메모리를 ì 게 쓰는 경우ì¼ìˆ˜ë¡ 효율ì javascriptë„ ì´ ë°©ì‹ì„ 사용한다. === Mark 단계 === * root ì—ì„œ ë„달 가능한 ê²ƒì„ Mark === Sweep 단계 === * Mark 단계ì—ì„œ ì²´í¬ë˜ì§€ ì•Šì€ ê²ƒë“¤ì€ ë„ë‹¬í• ìˆ˜ 없기 ë•Œë¬¸ì— ì‚ì œ === Lazy Sweep === * 한번 Dead 오브ì 트가 ë˜ë©´ ì˜ì›ížˆ Dead * mutator ë“¤ì€ mark-bitì— ì ‘ê·¼í• ìˆ˜ 없다 * '''Sweep 오í¼ë ˆì´ì…˜ì€ ë³‘ë ¬ë¡œ ì‹¤í–‰í•´ë„ ê´œì°®ë‹¤''' * 보다 간단한 해결책으로 allocate 함수ì—ì„œ sweep 수행 === Generation GC === * 약한 세대 가설 => 75~95% ê°ì²´ê°€ 10KB ì´ë‚´ì— 죽는다. === Mark-Sweep GC 특징 === * 뮤테ì´í„° 오버헤드가 작다 * 공간 오버헤드가 참조 카운팅보다 ì 다 * lazy sweep ê³¼ 조화시키면 ì „ì²´ ì²˜ë¦¬ëŸ‰ë„ ì¢‹ì€ íŽ¸ * íž™ì— ì¶©ë¶„í•œ ì—¬ìœ ê³µê°„ì„ í•„ìš”ë¡œ 한다 == JSC ì˜ ê°€ë¹„ì§€ ì»¬ë ‰í„° 구현 == * 발표 ppt 참조 == Eden collection == * JSC ì—서는 íž™ ê³µê°„ì„ ë¬¼ë¦¬ì 으로 나누지 않는다 * 그냥 root ì…‹ì—서부터 ë„달 가능한 ê°ì²´ë“¤ë§Œ marking í•˜ê³ ì¢…ë£Œ * Sweep ì€ allocation ì‹œì ì— lazy-sweep * marking ëœ ê°ì²´ë¥¼ Old gen 으로 간주 == Full collection == * Eden collection 수행 후 잔여 íž™ í¬ê¸°ê°€ 30% ë¯¸ë§Œì¼ ê²½ìš° ë‹¤ìŒ GC를 full collection 으로 예약 * 페ì´ì§€ê°€ 변경ë ë•Œ WebCore ì—ì„œ Full collection ì„ ìš”ì² * marking ì „ì—, ëª¨ë“ ë¸”ë¡ì˜ mark bitmap ì„ ì´ˆê¸°í™” * ì´í›„ ë™ìž‘ì€ eden collection ê³¼ ìœ ì‚¬ == JSC GC 세줄 요약 == 1. MarkedSpace::clearMarks() 2. JSC::visitChildren() 3. sweep()