Chapter 21, Real World OCaml, 그것은 말한다 : 당신의 수명이 짧은 값의 대부분이 열리는 곳여부
마이너 힙입니다. 은 개의 OCaml 블록 시퀀스를 포함하는 연속적인 가상 메모리 청크로 구성됩니다. 공백이 있으면 새 블록을 할당하면 CPU가 몇 개만 필요한 빠른 정수 시간 작업을 수행 할 수 있습니다.
마이너 힙을 가비지 수집하려면 OCaml은 복사 컬렉션을 사용하여 마이너 힙의 모든 라이브 블록을 주요 힙으로 옮깁니다. 이것은 보조 힙의 라이브 블록 수에 비례하여 작업을 취하고, 세대 가설에 따라 일반적으로 작은 입니다. 마이너 콜렉션은 실행 중에 세계를 멈추게합니다 (응용 프로그램을 중단시킵니다). 은 매우 짧은 시간에 응용 프로그램을 다시 시작할 수 있도록 을 빨리 완료하는 것이 중요합니다.
나는 분명히 말하듯이 작은 힙에서 라이브 메모리는 주요 힙으로 이동한다는 것을 알고 있습니다.
그러나 Gc가 마이너 힙에서 라이브 메모리를 결정하는 방법은 무엇입니까?
큰 힙을위한 마크와 스윕 프로세스가 동일합니까?
기본적으로, gc에서 주요한 힙, 스택에서 일부 뿌리를 시작하고 아무것도 도달 할 수 있습니다.
minor에 대한 gc도이 경우 OCaml은 마이너 힙 메모리로 연결되는 루트를 빠르게 알 수 있습니까? 또는 어떤 루트가 주요 메모리로 이어지는 지 빠르게 알 수 있습니까?
내 혼란 OCaml의 주요에로 작은에서 동일한 GC 작업을 수행하는 경우, 어떻게 OCaml의 구별 할 수 있다는 사실입니까? 둘 다 스택에서 시작한다면 GC가 메이저를 포함하지 않고 미성년자 만 수집하는 방법은 무엇입니까?
편집
은의이 작은 힙 크기는 4킬로바이트 가정하자.
let f =
let a1 = Array.make (4 * 1024) 1 in
let a2 = Array.make (4 * 1024) 2 in
let a3 = Array.make (4 * 1024) 3 in
...
위의 코드에서
a1
의 주소가 스택에 넣어되며, 실제 배열이 작은 힙에있을 것입니다 : 여기에 몇 가지 코드입니다. 스택 모양은[a1]
입니다.a2
을 생성 중입니다. 사소한 힙이 가득 찼기 때문에 사소한 힙을 발견 할 것입니다. gc는 스택을 살펴본 후 a1을 따르고 a1이 라이브인지 결정한 다음a1's array
이 주요 힙에 복사되고 a1의 포인터가 major의 새 주소로 변경됩니까? 스택은 이제[a2;a1]
처럼 보입니다.a3
을 생성 중입니다. 2와 마찬가지로, 그것은 사소한 gc를 수행해야합니다.gc는 a2와 a1을 모두 통과합니까? 특히 a1은 메이저에 있더라도?
당신은 윌슨의 http://www3.nd.edu/~dthain/courses/cse40243/spring2006/gc-survey.pdf을 읽어야합니다. StackOverflow 질문에서 알아낼 필요가 없습니다. –