Top

THE GARBAGE COLLECTION HANDBOOK [가비지 컬렉션을 기반으로 한 메모리 관리 기법]

  • 원서명The Garbage Collection Handbook: The Art of Automatic Memory Management (ISBN 9781420082791)
  • 지은이리차드 존스(Richard Jones), 앤토니 호스킹(Antony Hosking), 엘리엇 모스(Eliot Moss)
  • 옮긴이김점갑
  • ISBN : 9788960778238
  • 45,000원
  • 2016년 02월 04일 펴냄 (절판)
  • 페이퍼백 | 672쪽 | 188*250mm

판매처

  • 현재 이 도서는 구매할 수 없습니다.

책 소개

요약

현대 프로그래밍 언어 구현의 필수적 요소인 동적 자동 메모리 관리 기법의 핵심이 되는 가비지 컬렉션에 관한 전반적인 내용을 다룬다. 주요 내용으로는 전통적인 알고리즘에 기반을 둔 가비지 컬렉션 기법에서부터 병렬적, 병행적, 실시간 시스템에서의 가비지 컬렉션 기법에 이르기까지 광범위하며, 가비지 컬렉터 동작 방식에 대한 좀 더 나은 통찰력을 제공한다.

이 책에서 다루는 내용

『Garbage Collection』(1996)의 후속으로 완벽한 최신의 독보적인 개정판

병렬적, 병행적, 실시간 가비지 컬렉션 알고리즘을 철저히 분석

런타임 시스템 인터페이스를 비롯해 가비지 컬렉션의 까다로운 면을 설명

2,500 종류가 넘는 가비지 컬렉션 관련 문서가 담긴 포괄적인 온라인 데이터베이스에 의한 지원

이 책의 대상 독자

이 책에는 지난 50년간에 걸친 자동 메모리 관리 연구자와 개발자들이 축척한 다양한 경험을 함께 수록하려 노력했다. 문헌은 방대해 우리가 제시한 온라인 참고 문헌은 이 책의 집필 당시에 2,500 항목 정도였다. 가장 중요한 접근법과 최신 기술을 하나의 접근 가능한 프레임워크 내에서 논의하고 비교한다. 일관적인 스타일과 용어를 사용해 알고리즘과 개념을 제시함에 있어서 신중을 기했다. 이들 알고리즘과 개념은 종종 의사코드와 예시를 통해 자세하게 설명한다. 성능이 중요시되는 곳에서는 동기화를 위한 기본 연산의 선택과 캐시 같은 하드웨어 요소가 알고리즘 설계에 영향을 주는 것과 같은 저수준(Low Level)의 세부 사항에 주의를 기울였다.

특히 지난 10여 년간에 걸쳐 하드웨어와 소프트웨어 향상으로 인해 가비지 컬렉션에 주어진 새로운 도전적 과제를 언급한다. 프로세서와 메모리 간의 성능 간극은 대체로 계속 커지고 있다. 프로세서 클럭 속도는 증가했고 더 많은 코어가 프로세서에 위치하며, 다수의 프로세서 모듈을 가진 구성이 일반화됐다. 고성능 가비지 컬렉터의 설계자와 구현가들을 위해 이런 변경의 결과에 대해 중점을 둔다. 이들의 알고리즘은 캐시 성능이 중요시되므로 지역성을 고려해야 한다. 늘어난 애플리케이션 프로그램들은 멀티코어 프로세서에서 멀티스레드화된 멀티코어 프로세서에서 실행된다. 순차적 병목현상을 회피하게끔 메모리 관리자를 설계해야 한다. 반면 새로운 하드웨어가 제공하는 병렬성을 이용할 수 있게 가비지 컬렉터를 설계해야 한다.

Jones[1996]는 당시에 여러 개의 컬렉터 스레드를 병렬로 실행할 수 있을지에 대해서는 전혀 고려하지 않았다. 집필 당시에는 생소하게 보였던 점진적 수집과 병행적 수집에 관해 한 단원을 할애한다.

현대 하드웨어가 제공하는 가능성과 제약은 이 책 전반에 걸쳐 민감한 부분이다. 이 책 전체에 걸쳐 지역성 문제를 다룬다. 시작 부분부터 애플리케이션 프로그램은 멀티스레드화될 수 있음을 가정한다. 좀 더 단순하고 전통적인 알고리즘을 많이 다루겠지만, 병렬성과 점진적, 병행성, 실시간 가비지 컬렉션 논의에 이 책의 절반을 할애한다. 이러한 내용들이 프로그래밍 언어 구현에 관심이 있는 대학원생과 연구자, 개발자에 도움이 될 것을 희망한다. 프로그래밍 언어와 컴파일러 구축, 소프트웨어 엔지니어링, 운영체제의 고급정을 수강하는 학부생에게도 이 책은 유용하다. 더욱이 여기서 제공하는 지식을 통해 전문적 프로그래머에게도 가비지 컬렉터가 직면한 문제와 상이한 컬렉터가 동작하는 방식에 좀 더 나은 통찰력을 제공해 여러 언어가 제공하는 가비지 컬렉터를 선택하고 구성하는데 있어서 좀 더 진보가 있기를 희망한다. 현대 프로그래밍 언어가 거의 채택하고 있는 가비지 컬렉션의 완전한 이해는 모든 프로그래머에게는 필수적이다.

이 책의 구성

2장에서는 자동 저장 공간 회수가 바람직한 이유를 설명하고, 상이한 가비지 컬렉션 전략을 비교할 수 있는 방법을 소개한다. 이 책 전반에 걸쳐 사용되는 추상화와 의사코드 표기법의 설명으로 끝을 맺는다.

3장에서 6장까지는 고전적인 가비지 컬렉션을 구성하는 부분들을 상세히 다룬다. 마크 스윕과 마크 컴팩트, 복사 가비지 컬렉션, 참조 카운팅을 살펴본다. 현대 하드웨어에서 이들 구현에 특히 초점을 맞춰 이들 전략을 좀 더 심도 있게 다룬다. 좀 더 일반적인 소개를 원하는 독자는 이전에 출판된 『Garbage Collection: Algorithms for Automatic Dynamic Memory Management』(Wiley, 1996)을 참고하기 바란다. 7장에서는 2장에서부터 5장에 걸쳐 다룬 전략과 알고리즘에 대해 이들의 장점과 약점, 다른 컨텍스트에서의 적용 가능성을 좀 더 심도 있게 비교한다.

저장 공간이 회수되는 방식은 저장 공간이 할당되는 방식에 좌우된다. 7장에서는 메모리 할당의 상이한 방법을 고려해보고, 자동 가비지 컬렉션이 할당자의 정책(명시적 malloc/free 메모리 관리와는 다른 정책)에 영향을 주는 정도를 검토해본다.

1장에서 7장까지는 힙 내의 모든 객체는 동일한 방식으로 관리된다는 암묵적인 가정을 한다. 하지만 이런 가정이 왜 취약한 설계인지에 대해서는 여러 이유가 있다. 8장부터 10장까지는 힙을 다른 공간으로 분할하는 이유와, 이들 분할된 공간을 관리하는 방법을 고려해본다. 객체 관리에 가장 성공적인 전략 중 하나인 세대별 가비지 컬렉션을 살펴보고 대규모 객체와 기타 여러 분할 기법을 다루는 방법을 알아본다.

런타임 시스템의 나머지 부분과의 인터페이스는 컬렉터 구축의 가장 까다로운 부분이다. 11장을 포인터 찾기와, 수집하기에 안전한 지점, 읽기 및 쓰기 장벽을 비롯한 런타임 인터페이스에 할애했고, 12장을 최종화와 약한 참조 같은 언어 특정적인 관심 사항에 할애했다.

이제 관심사를 병행성으로 돌려보자. 13장에서는 현대 하드웨어가 가비지 컬렉션 구현가에게 제공하는 것을 조사해보고, 동기화와 진행, 종료, 의견 수렴에 대한 알고리즘을 살펴본다. 14장에서는 모든 애플리케이션 스레드가 중지된 동안에 병렬적으로 다중 컬렉터 스레드를 실행하는 방법을 알아본다. 15장에서부터 18장까지는 광범위한 병행적 컬렉터를 고려해보고, 사용자 프로그램에 가장 짧은 간섭을 가지면서 수집이 일어날 수 있도록 스레드 중지 방식의 요건을 완화한다. 마지막으로 19장에서는 이런 요건을 가장 도전적인 극한 상황인 경성 실시간 시스템용의 가비지 컬렉션으로 확장해본다.

각 장의 마지막 부분에 고려할 사항을 요약해뒀다. 이는 독자들로 하여금 자신들의 시스템이 갖는 요건이 무엇이며, 이들 요건을 어떻게 충족시킬지에 대한 질문을 불러일으키기 위해 의도한 것이다. 클라이언트 프로그램의 동작과 이들의 운영체제, 하부의 하드웨어에 관한 질문에 대해 해답을 주지는 않았다. 이들 요약 사항은 해당 장을 읽는 것을 대신하지는 못한다. 요약 사항은 압축한 해결책을 의도한 것이 아니며, 추가적인 분석에 논의의 초점을 두고자 함이다.

마지막으로, 빠진 부분은 무엇일까? 런타임 시스템에 장착된 메모리 관리의 자동 기법만 을 고려했다. 따라서 언어 명세에 가비지 컬렉션이 적시돼 있는 경우라도 이들 언어가 지원할 수도 있는 메모리 관리에 관한 다른 메커니즘을 심도 있게 논의하지 못했다. 가장 분명한 예는 ‘영역’의 사용인데, 이는 자바의 실시간 명세에서 가장 두드러지게 사용됐다. 영역 추론 문제나 스택 할당 문제에 잠시 관심을 기울였지만, 가비지 컬렉션을 대체하거나 최소한 이를 보조할 의도의 여타 컴파일 시점의 분석은 전혀 하지 못했다. 클라이언트 프로그램에서 참조 카운팅 같은 기법을 최적으로 사용하는 방법이 C++ 같은 언어에서 인기가 많을지라도 이를 언급하지 하지 않았다. 마지막으로, 지난 10년 동안에는 분산 가비지 컬렉션에서 새로운 연구가 거의 없었다. 다방면으로 이는 안타까운 일이다. 그 분야에서 배울 내용들이 매우 비일관적인 메모리 아키텍처에서 이질적인 수집을 하는 차세대 머신을 위한 컬렉터 개발에 유용할 수도 있었기 때문이다. 그럼에도 불구하고 분산 가비지 컬렉션을 언급하지 않았다.

저자/역자 소개

지은이의 말

맥카시(McCarthy)와 콜린(Collins)이 작성한 동적 자동화 메모리 관리(즉, 가비지 컬렉션)에 관한 첫 번째 논문의 50주년이 되는 해에 이 책의 집필이 거의 완료돼 그 기념일을 축하할 따름이다. 가비지 컬렉션은 리스프(Lisp) 프로그래밍 언어에서 처음 도입됐다. 이상한 우연이지만, 1958년에 시작된 리스프의 구현 이후로 정확히 40년이 되는 1998년 10월, 메모리 관리에 관한 첫 번째 국제 심포지엄의 10주년 기념에 관한 글을 쓰기 시작했다. 맥카시는 첫 번째 온라인 시범이 MIT 산업 관련 심포지엄에서 있었다고 회고했다. 좋은 인상을 남기는 것이 중요했지만, 불행히도 시범 중간에 IBM 7041은 자신의 32k 워드 메모리 전체를 소진하고서(맥카시 팀은 바로 전의 리허설에서 리스프 코어 이미지를 리프레시하는 것을 잊어버렸다) Flexowriter는 초당 10 문자를 인쇄하는 데 그쳤고, 이로 인해 시연의 남은 시간을 모두 사용해버렸다. 맥카시와 청중들은 폭소를 터트릴 수밖에 없었다(실제로 다음 문장만 출력하고 시연이 끝나버렸다 - 옮긴이).

THE GARBAGE COLLECTOR HAS BEEN CALLED. SOME INTERESTING
STATISTICS ARE AS FOLLOWS: (가비지 컬렉터가 호출됐으며, 일부 흥미 있는 통계치는 다음과 같다:)

50년이 지난 지금, 가비지 컬렉션은 더 이상 조롱거리가 아니며 현대 프로그래밍 언어 구현의 필수적 요소가 됐다. 실제로 비주얼 베이직(1991년 소개됨)은 1990년 이래로 개발된 언어 중에서 자동 메모리 관리를 채택하지 않은 채 가장 광범위하게 사용되는 언어일 것이 다. 하지만 그 후속인 VB.NET(2002)은 마이크로소프트의 공통 언어 런타임에 있는 가비지 컬렉터에 의존한다.

가비지 컬렉션이 이뤄지는 언어가 소프트웨어 개발에 제공하는 장점은 다양하다. 회수된 메모리를 여전히 참조하는 댕글링 포인터를 따라가거나, 이를 다른 컨텍스트에서 재사용하려는 것과 같은 더욱 나쁜 전반적인 버그를 없애준다. 이미 해제된 메모리를 해제하는 것은 더 이상 용납되지 않는다. 메모리 누수와 관련된 오류를 모두 방지하지는 못할지라도 프로그램의 메모리 누수 가능성을 줄여준다. 병행성 자료 구조의 구축과 사용을 매우 단순화시켜준다. 무엇보다도 가비지 컬렉션이 제공하는 추상화는 좀 더 뛰어난 소프트웨어공학적 관례를 제공한다. 사용자 인터페이스를 단순화해 이해와 유지 보수가 쉬운 코드의 생성이 가능하며, 그 결과로 좀 더 신뢰할 만해진다. 인터페이스에서 메모리 관리 걱정을 없앰으로써 재사용이 좀 더 쉬운 코드를 생성할 수 있다.

메모리 관리 분야는 소프트웨어와 하드웨어 양 측면에서 최근에 급속도로 향상됐다. 디지털 사의 알파칩에 기반을 둔 고사양 워크스테이션이 266MHz 속도를 지녔지만, 1996년에 인텔 펜티엄 프로세서는 120MHz의 클록 속도를 보였다. 최신 고사양 프로세서는 3GHz를 상외하며, 멀티코어 칩이 주류를 이룬다. 채용된 주 메모리의 크기는 거의 1000배까지 증가했으며, 데스크톱 머신의 일반적인 메모리 크기는 수 메가바이트에서 4기가바이트에 이른다. DRAM 메모리의 성능 향상은 이들 프로세서에 비해 크게 뒤떨어지지 않는다.

그 당시에 가비지 컬렉션은 모든 메모리 관리 문제에 대한 만병통치약이 아니라고 적시했고, 특히 경성 실시간 프로그램(마감 시한이 실패 없이 지켜져야 한다)에서 가비지 컬렉션의 문제는 아직 해결되지 않았다고 언급했다. 하지만 오늘날 경성 실시간 컬렉터는 이제 실험실에서 벗어나 상업적으로 시스템에 채택되고 있다. 현대 가비지 컬렉터 구현에서 많은 문제가 해결되었을지라도 새로운 하드웨어와 새로운 환경, 새로운 애플리케이션은 메모리 관리에 관한 새로운 연구 과제를 던져준다.

지은이 소개

리차드 존스(Richard Jones)

캔터베리(Canterbury) 소재의 켄트대학교 컴퓨팅 학교의 컴퓨터 시스템 교수다. 옥스퍼드대학교에서 1976년에 수학 학사학위를 받았다. 켄트 대학교에 오기 전 몇 년간은 교직에 몸담고 있었다. 이후로 켄트대학교에 줄곧 머무르면서 1989년에 컴퓨터 사이언스 분야의 이학 석사학위를 받았다. 1998년, 메모리 관리에 관한 국제 심포지엄을 공동 창립하고 첫 의장을 역임했다. 가비지 컬렉션과 힙 시각화, 전자 출판에 관한 다수의 논문을 발표했다. 정기적으로 선도적인 국제 컨퍼런스의 프로그램 위원으로 참석한다. 「Software Practice and Experience」의 편집 위원회 멤버이기도 하다. 동적 메모리 관리에 관한 연구와 업적을 인정받아 2005년에 글래스고대학교의 명예 교수로 위촉받았으며, 2006년에는 Distinguished Scientist of the Association for Computing Machinery의 명예 회원으로 선정됐다. 세 명의 자녀가 있으며, 여가 시간에는 닷 18 카타마란스(Dart 18 catamarans, 요트의 일종)를 즐긴다.

앤토니 호스킹(Antony Hosking)

웨스트 라피엣(West Lafayette) 지역의 퍼듀대학교 컴퓨터 과학과의 부교수로 재직 중이다.

1985년, 오스트레일리아의 애들레이드대학교에서 수리학 학사학위를 받았으며, 1987년 뉴질랜드 와이카토대학교에서 이학 석사학위를 받았다. 매사추세츠대학교 애머스트캠퍼스에서 연구를 계속해 1995년 전산학 분야의 박사학위를 받았다. 프로그래밍 언어 설계와 구현 분야에 업적을 남겼는데, 특히 데이터베이스와 지속적 프로그래밍 언어, 객체지향 데이터베이스 시스템, 동적 메모리 관리, 컴파일러 최적화, 프로그래밍 언어와 애플리케이션을 위한 아키텍처 지원 분야에 흥미가 있었다. Association for Computing Machinery의 수석 위원이며, IEEE의 회원이기도 하다. 주로 프로그래밍 언어 설계와 구현에 중점을 둔 주요 컨퍼런스의 프로그램 및 조정 위원회에 정기적으로 참석한다. 세 명의 자녀를 뒀다. 기회가 있을 때마다 애들레이드 경기장에서 첫 시범 경기를 보는 것을 즐긴다.

엘리엇 모스(Eliot Moss)

매사추세츠대학교 애머스트캠퍼스의 전산학과 교수다. 캠브릿지 소재의 매사추세츠공과 대학교에서 1975년에 BSEE, 1978년에 MSEE, 1981년에 전산학 박사학위를 받았다. 4년 간의 군 복무 후에 매사추세츠대학교 애머스트캠퍼스의 전산학 교수로 합류했다. 프로그래밍 언어와 그 구현 분야에 대한 연구를 진행했으며, 1987년에 가비지 컬렉터를 구축했다. 자동 메모리 관리에 관한 그의 연구 이외에도 지속성 프로그래밍 언어와 가상 머신 구현, 트랜잭션 프로그래밍, 트랜잭션 메모리 분야에서도 그의 업적은 널리 알려져 있다.

IBM 연구가들과 협업해 학술적 연구 용도의 Jikes RVM 자바 가상머신을 라이선스화했으며, 곧 오픈소스 프로젝트로 그 라이선스를 해제했다. ###2007년, Association for Computing Machinery의 회원으로 이름을 올렸으며, 2009년에 IEEE 회원이 됐다. Association for Computing Machinery’s Special Interest Group on Programming Languages에서 4년간 헌신했으며, 자신의 연구 분야와 관련이 있는 중요한 단체의 프로그램 및 기술 조정위원회에서 봉사했다. 2005년, 영국 성공회의 사제로 임명돼 예배를 주도하며 학술적 연구 생활을 영위하고 있다. 결혼을 해 두 명의 자녀를 뒀다. 녹음된 책을 듣고 영화 관람을 좋아하며, 하프 연주를 즐긴다.

옮긴이의 말

프로그램 분야가 많지만 항상 그 기저에는 자원의 효율성이라는 대전제를 바탕으로 하고 있다. 컴퓨팅 분야의 역사에서 언제나 그랬듯이 가장 핫한 관심 대상인 분야는 메모리였고, 지금도 그럴 것이다. 하드웨어적 기술과 소프트웨어 동작 방식 또한 메모리 사용의 효율성에 기반을 두고 기술 향상이 이뤄졌음은 당연하다. 소프트웨어 측면에서 자동 메모리 관리 기법의 가장 핵심에 자리 잡고 있는 분야가 바로 가비지 컬렉션이다.

이 책에서는 전통적으로 가비지 컬렉션이 수행하는 작업과 알고리즘을 먼저 소개한다. 그러고 나서 좀 더 도전적인 사항들을 소개한다. 현대의 고성능 가비지 컬렉션 설계를위해 필요한 멀티코어 프로세서 모듈에 장착된 캐시 아키텍처를 고려한 알고리즘을 소개하며, 이와 더불어 새로운 하드웨어가 제공할 수도 있는 병렬성을 이용할 수 있는 컬렉터 설계에 대한 기본 지식도 제공한다. 그리고 최근 많은 임베디드 시스템에서 사용되는 실시간 시스템에서의 가비지 컬렉션에 필요한 요구 조건과 그 충족 방법을 제시한다.

최신 컴퓨터 시스템 아키텍처 또한 가비지 컬렉션과 연동하며, 근래의 모든 프로그래밍 언어는 가비지 컬렉션을 고려한 설계가 이뤄져 있고, 컴파일러 최적화 기법 또한 가비지 컬렉션과 연동한다. 현재 프로그래머이고 또한 전문적인 프로그래머를 꿈꾸는 누구라도 그 기저에서 동작하는 자동 메모리 자원 관리의 원리를 이해하고 구현 방식을 파악하며, 더 나아가서 도전적인 가비지 컬렉션을 설계하고 프로그래밍 언어 설계를 희망하는 사람이라면 이 책은 그 앞길에 한 줄기 빛이 될 것이라고 확신한다.

옮긴이 소개

김점갑

경북대학교 컴퓨터 공학과를 졸업한 후 삼성전자에서 GNU 컴파일러를 기반으로 ARM CORE 컴파일러 포팅/개발을 했다. 이후 하제소프트를 거쳐 데브구루를 공동으로 창업해 다양한 디바이스 드라이버를 개발했으며, 다수의 드라이버 강의나 세미나와 교육을 진행 했으며 (주)안랩에서 보안 관련 시스템 프로그램 개발 업무를 하고서, 현재는 여행 사진에 관심이 많다.

목차

목차
  • 1장 소개
  • 1.1 명시적 해제
  • 1.2 자동 동적 메모리 관리
  • 1.3 가비지 컬렉션 알고리즘 비교
    • 안전성
    • 처리량
    • 완전성과 신속성
    • 정지 시간
    • 공간 오버헤드
    • 특정 언어의 최적화
    • 확장성과 이식성
  • 1.4 성능의 불이익?
  • 1.5 실험적 방법론
  • 1.6 용어와 표기
    • 뮤테이터와 컬렉터
    • 뮤테이터 루트
    • 참조와 필드, 주소
    • 생명성과 정확성, 접근성
    • 의사 코드
    • 할당자
    • 뮤테이터 읽기와 쓰기 연산
    • 원자적 연산
    • 집합과 멀티셋, 시퀀스, 튜플

  • 2장 마크 스윕 가비지 컬렉션
  • 2.1 마크 스윕 알고리즘
  • 2.2 3색 추상화
  • 2.3 마크 스윕 개선
  • 2.4 비트맵 마킹
  • 2.5 지연된 스위핑
  • 2.6 마킹 루프에서 캐시 미스
  • 2.7 고려할 사항
    • 뮤테이터 오버헤드
    • 처리량
    • 공간 사용량
    • 이동시킬 것인가 말 것인가?

  • 3장 마크 컴팩트 가비지 컬렉션
  • 3.1 두 손가락 압축
  • 3.2 리스프 2 알고리즘
  • 3.3 스레디드 압축
  • 3.4 단일 패스 알고리즘
  • 3.5 고려할 사항
    • 압축이 필요한가?
    • 압축에 의한 처리량의 비용
    • 생명주기가 긴 데이터
    • 지역성
    • 마크 컴팩트 알고리즘의 한계

  • 4장 복사 가비지 컬렉션
  • 4.1 반공간 복사 컬렉션
    • 작업 리스트 구현
    • 예제
  • 4.2 순회 순서와 지역성
  • 4.3 고려할 사항
    • 할당
    • 공간과 지역성
    • 객체 이동

  • 5장 일반화 선형 모형과 지수족
  • 5.1 참조 카운팅의 장단점
  • 5.2 효율성 개선
  • 5.3 지연 참조 카운팅
  • 5.4 병합 참조 카운팅
  • 5.5 순환 참조 카운팅
  • 5.6 제한된 필드 참조 카운팅
  • 5.7 고려할 사항
    • 환경
    • 고급 해결책

  • 6장 가비지 컬렉터 비교
  • 6.1 처리량
  • 6.2 정지 시간
  • 6.3 공간
  • 6.4 구현
  • 6.5 적응 시스템
  • 6.6 가비지 컬렉션의 통합 이론
    • 추상 가비지 컬렉션
    • 추적 가비지 컬렉션
    • 참조 카운팅 가비지 컬렉션

  • 7장 할당
  • 7.1 순차 할당
  • 7.2 프리 리스트 할당
    • 최초 적합 할당
    • 차선 적합 할당
    • 최적 적합 할당
    • 프리 리스트 할당의 속도 개선
  • 7.3 단편화
  • 7.4 분리 적합 할당
    • 단편화
    • 크기 클래스 채우기
  • 7.5 분리 적합과 최초, 최적, 차선 적합과의 조합
  • 7.6 추가 고려 사항
    • 정렬
    • 크기 제한
    • 경계 태그
    • 힙 파싱 가능성
    • 지역성
    • 비사용 영역의 보존
    • 교차 맵
  • 7.7 병행 시스템에서의 할당
  • 7.8 고려할 사항

  • 8장 힙 분할
  • 8.1 용어
  • 8.2 분할 이유
    • 이동성에 의한 분할
    • 크기에 의한 분할
    • 공간에 의한 분할
    • 종류에 의한 분할
    • 효율성을 위한 분할
    • 정지 시간 단축을 위한 분할
    • 지역성을 위한 분할
    • 스레드에 의한 분할
    • 사용 가능성에 의한 분할
    • 가변성에 의한 분할
  • 8.3 분할 방법
  • 8.4 분할 시점

  • 9장 세대 가비지 컬렉션
  • 9.1 예제
  • 9.2 시간 측정
  • 9.3 세대 가설
  • 9.4 세대와 힙 배치
  • 9.5 다중 세대
  • 9.6 나이 기록
    • 집단적 승격
    • 반공간의 나이 기록
    • 생존자 공간과 유연성
  • 9.7 프로그램 동작에 적응
    • Appel식 가비지 컬렉션
    • 피드백 제어 승격
  • 9.8 세대 간 포인터
    • 기억 세트
    • 포인터 방향
  • 9.9 공간 관리
  • 9.10 구세대 우선 가비지 컬렉션
  • 9.11 벨트웨이
  • 9.12 세대별 수집을 위한 분석 지원
  • 9.13 고려할 사항
  • 9.14 추상 세대별 가비지 컬렉션

  • 10장 기타 분할 기법
  • 10.1 큰 객체 공간
    • 트레드밀 가비지 컬렉터
    • 운영체제의 지원을 통한 객체의 이동
    • 포인터가 없는 객체
  • 10.2 위상 컬렉터
    • 성숙 객체 공간 가비지 컬렉션
    • 연결 기반의 가비지 컬렉션
    • 스레드 로컬 가비지 컬렉션
    • 스택 할당
    • 영역 추론
  • 10.3 하이브리드 마크 스윕, 복사 컬렉터
    • 가비지 우선 알고리즘
    • 혼합 기법과 기타 방법
    • 제한된 메모리 공간에서의 복사 컬렉션
  • 10.4 북마킹 가비지 컬렉션
  • 10.5 이면 참조 카운팅
  • 10.6 고려할 사항

  • 11장 런타임 인터페이스
  • 11.1 할당 인터페이스
    • 할당 속도 높이기
    • 제로화
  • 11.2 포인터 찾기
    • 보수적인 포인터 찾기
    • 태깅된 값을 이용한 정확한 포인터 찾기
    • 객체 내의 정확한 포인터 찾기
    • 전역 루트에서 정확한 포인터 찾기
    • 스택과 레지스터 내에서 정확한 포인터를 찾기
    • 코드 내의 정확한 포인터 찾기
    • 내부 포인터 다루기
    • 파생 포인터 다루기
  • 11.3 객체 테이블
  • 11.4 외부 코드로부터의 참조
  • 11.5 스택 장벽
  • 11.6 GC 안전한 지점과 뮤테이터 일시 정지
  • 11.7 가비지를 수집하는 코드
  • 11.8 읽기 장벽과 쓰기 장벽
    • 엔지니어링
    • 쓰기 장벽의 정확성
    • 해시 테이블
    • 순차 저장 버퍼
    • 오버플로우 동작
    • 카드 테이블
    • 교차 맵
    • 카드 요약
    • 하드웨어와 가상 메모리 기법
    • 쓰기 장벽 메커니즘: 요약
    • 청크 리스트
  • 11.9 주소 공간 관리
  • 11.10 가상 메모리 페이지 보호의 응용
    • 이중 매핑
    • 접근 금지 페이지의 응용
  • 11.11 힙 크기 선택
  • 11.12 고려할 사항

  • 12장 언어 한정적인 사항
  • 12.1 최종화
    • 파이널라이저를 실행하는 시점
    • 어떤 스레드가 파이널라이저를 실행하는가?
    • 파이널라이저는 서로 병행적으로 실행할 수 있는가?
    • 파이널라이저는 도달 불가능해진 객체에 접근할 수 있는가?
    • 최종화가 진행된 객체는 언제 회수되는가?
    • 파이널라이저에서 오류가 있다면 어떻게 되는가?
    • 최종화에 대한 보장된 순서가 존재하는가?
    • 최종화 경쟁 문제
    • 파이널라이저와 락
    • 특정 언어에서의 최종화
    • 추가 논의
  • 12.2 약한 참조
    • 추가 동기
    • 다양한 포인터 강도 지원
    • Phantom 객체를 사용한 최종화 순서 조정
    • 약한 포인터 정리 시의 경쟁
    • 약한 포인터 정리에 대한 통지
    • 여타 언어에서의 약한 포인터
  • 12.3 고려할 사항
  • 13장 병행성 입문
  • 13.1 하드웨어
    • 프로세서와 스레드
    • 상호 연결
    • 메모리
    • 캐시
    • 일관성
    • 캐시 일관성 성능 예제: 스핀 락
  • 13.2 하드웨어 메모리 일관성
    • 펜스와 선행 발생
    • 일관성 모델
  • 13.3 하드웨어 기본 연산
    • Compare-and-swap
    • Load-linked/store-conditionally
    • 원자적 기본 산술 연산
    • Test-then-test-and-set
    • 좀 더 강력한 기본 연산
    • 원자적 기본 연산의 오버헤드
  • 13.4 진행 보장
    • 진행 보장과 병행성 수집
  • 13.5 병행성 알고리즘에서의 표기법
    • 명시적 펜스 지점
  • 13.6 상호 배제
  • 13.7 작업 공유와 종료 탐지
    • 랑데뷰 장벽
  • 13.8 병행성 자료 구조
    • 병행성 스택
    • 단일 연결 리스트로 구현된 병행성 큐
    • 배열로 구현된 병행성 큐
    • 작업 가져오기 용도의 병행성 데큐
  • 13.9 트랜잭션 메모리
    • 트랜잭션 메모리란 무엇인가?
    • 수집 구현에 도움이 되는 트랜잭션 메모리 사용
    • 가비지 컬렉션에서의 트랜잭션 메모리 지원
  • 13.10 고려할 사항

  • 14장 병렬 가비지 컬렉션
  • 14.1 병렬화할 만한 충분한 작업이 존재하는가?
  • 14.2 부하 분산
  • 14.3 동기화
  • 14.4 분류
  • 14.5 병렬 마킹
    • 프로세서 중심적 기법
  • 14.6 병렬 복사
    • 프로세서 중심적 기법
    • 메모리 중심적 기법
  • 14.7 병렬적 스위핑
  • 14.8 병렬 압축
  • 14.9 고려할 사항
    • 용어
    • 병렬 수집을 할 만한 가치가 있는가?
    • 작업 분산 전략
    • 추적 관리
    • 저수준 동기화
    • 스윕과 압축
    • 종료

  • 15장 병행성 가비지 컬렉션
  • 15.1 병행성 수집의 정확성
    • 다시 살펴보는 삼색 추상화
    • 손실된 객체 문제
    • 강한 삼색 불변성과 약한 삼색 불변성
    • 정밀성
    • 뮤테이터 색상
    • 할당 색상
    • 점진적 갱신 해결책
    • 시작 시점에서 스냅샷을 이용한 해결책
  • 15.2 병행성 수집에서의 장벽 기법
    • 그레이 뮤테이터 기법
    • 블랙 뮤테이터 기법
    • 장벽 기법의 완벽성
    • 병행성 쓰기 장벽 메커니즘
    • 1단계 카드 테이블
    • 2단계 카드 테이블
    • 작업 줄이기
  • 15.3 고려할 사항

  • 16장 병행적 마크 스윕
  • 16.1 초기화
  • 16.2 종료
  • 16.3 할당
  • 16.4 병행적 마킹과 스윕
  • 16.5 온더플라이 마킹
    • 온더플라이 수집에서의 쓰기 장벽
    • Doligez-Leroy-Gonthier
    • 자바에서의 Doligez-Leroy-Gonthier
    • 슬라이딩 뷰
  • 16.6 추상적 병행성 수집
    • 컬렉터 파면
    • 원래 객체 추가
    • 뮤테이터 장벽
    • 정밀도
    • 컬렉터의 인스턴스화
  • 16.7 고려할 사항

  • 17장 병행성 복사와 압축
  • 17.1 모스틀리 병행적 복사: 베이커 알고리즘
    • 모스틀리 병행적, 모스틀리 복사 수집
  • 17.2 Brook의 간접 장벽
  • 17.3 자가 삭제 읽기 장벽
  • 17.4 복제 복사
  • 17.5 다중 버전의 복사
    • 카피온라이트 방지를 위한 확장
  • 17.6 사파이어
    • 컬렉터 단계
    • 병합 단계
    • 휘발성 필드
  • 17.7 병행성 압축
    • 컴프레서
    • 무정지
  • 17.8 고려할 사항

  • 18장 병행성 참조 카운팅
  • 18.1 단순한 참조 카운팅 다시 살펴보기
  • 18.2 버퍼화된 참조 카운팅
  • 18.3 병행적, 순환 참조 카운팅
  • 18.4 힙 스냅샵 담기
  • 18.5 슬라이딩 뷰 참조 카운팅
    • 연령 지향적인 수집
    • 알고리즘
    • 슬라이딩 뷰 순환 회수
    • 메모리 일관성
  • 18.6 고려할 사항

  • 19장 실시간 가비지 컬렉션
  • 19.1 실시간 시스템
  • 19.2 실시간 컬렉션 스케줄링
  • 19.3 작업 기반의 실시간 수집
    • 병렬적, 병행적 복제
    • 작업 기반 스케줄링에서 불균형한 작업과 그 영향
  • 19.4 슬랙 기반의 실시간 컬렉션
    • 컬렉터 작업 스케줄링
    • 실행 오버헤드
    • 프로그래머 입력
  • 19.5 시간 기반의 실시간 수집: 메트로놈
    • 뮤테이터 사용량
    • 예측 가능성 지원
    • 분석
    • 견고성
  • 19.6 스케줄링 접근법 통합: 증세 정책
    • 증세 정책 스케줄링
    • 증세 정책 선제 조건
  • 19.7 단편화 제어
    • 메트로놈에서 점진적 압축
    • 단일 프로세서에서의 점진적 복제
    • 무정지: 락이 없는 가비지 컬렉션
    • 스타카토: 뮤테이터 대기 없음을 이용한 최선의 압축
    • 치킨: x86에서 뮤테이터 대기가 없는 최선의 압축
    • 클로버: 락이 없는 확률적 뮤테이터를 이용한 보장된 압축
    • 무정지 기법과 치킨, 클로버의 비교
    • 단편화된 할당
  • 19.8 고려할 사항

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

[p.43 : 1.6 용어와 표기 4행]
210, 220, 230, 240 바이트이다.
->
2^10, 2^20, 2^30, 2^40 바이트이다.