More actions
No edit summary |
(Repair batch-0005 pages from live compare) |
||
| (10 intermediate revisions by 2 users not shown) | |||
| Line 2: | Line 2: | ||
== Contents == | == Contents == | ||
* GC 의 개요 | * GC 의 개요 | ||
* JSC(WebKit) 의 GC 구현 | * JSC(WebKit) 의 GC 구현 | ||
| Line 12: | Line 11: | ||
== GC vs Manual == | == GC vs Manual == | ||
* 프로그래머의 생산성 | * 프로그래머의 생산성 | ||
* 프로그램의 효율성 | * 프로그램의 효율성 | ||
| Line 23: | Line 21: | ||
== Definitions == | == Definitions == | ||
* Heap | * Heap | ||
프로그램 사용 영역 | 프로그램 사용 영역 | ||
| Line 32: | Line 29: | ||
== Object Liveness == | == Object Liveness == | ||
* Dead : 안쓰고 있는 메모리 | * Dead : 안쓰고 있는 메모리 | ||
* Live : 사용하고 있는 메모리 | * Live : 사용하고 있는 메모리 | ||
| Line 44: | Line 40: | ||
* JSC 에서도 이 알고리즘을 사용 | * JSC 에서도 이 알고리즘을 사용 | ||
* 메모리를 많이 쓸 수록 느려짐 => 메모리를 적게 쓰는 경우일수록 효율적 | |||
javascript도 이 방식을 사용한다. | javascript도 이 방식을 사용한다. | ||
=== Mark === | === Mark 단계 === | ||
* root 에서 도달 가능한 것을 Mark | |||
=== Sweep 단계 === | |||
* Mark 단계에서 체크되지 않은 것들은 도달할수 없기 때문에 삭제 | |||
=== Sweep === | === 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 세줄 요약 === | |||
# MarkedSpace::clearMarks() | |||
# JSC::visitChildren() | |||
# sweep() | |||
Latest revision as of 00:44, 27 March 2026
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 세줄 요약
- MarkedSpace::clearMarks()
- JSC::visitChildren()
- sweep()