쓰레기 수집 ( 컴퓨터 과학 ) - 위키백과, 우리 모두의 백과사전 쓰레기 수집 ( 컴퓨터 과학 ) 위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 이 문서의 내용은 출처가 분명하지 않습니다. 이 문서를 편집하여, 신뢰할 수 있는 출처를 표기해 주세요. 검증되지 않은 내용은 삭제될 수도 있습니다. 내용에 대한 의견은 토론 문서에서 나누어 주세요. ( 2010년 9월 ) 쓰레기 수집 ( garbage collection 가비지 컬렉션 [ * ], GC ) 은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 영어를 그대로 읽어 가비지 컬렉션이라 부르기도 한다. 1959년 무렵 리스프의 문제를 해결하기 위해 존 매카시가 개발하였다. [ 1 ] 목차 1 개요 2 장단점 3 포인터 추적 방식 3. 1 접근 가능한 객체 3. 2 여러가지 포인터 추적 기법 3. 2. 1 표시하고 쓸기 ( mark and sweep ) 3. 2. 2 삼색 표시 기법 3. 2. 3 객체 이동 기법 3. 2. 4 세대 단위 쓰레기 수집 4 참조 횟수 계산 방식 5 쓰레기 수집 기법을 사용하는 언어 6 같이 보기 7 각주 개요 [ 편집 ] 쓰레기 수집은 동적 할당된 메모리
횟수 계산 방식 5 쓰레기 수집 기법을 사용하는 언어 6 같이 보기 7 각주 개요 [ 편집 ] 쓰레기 수집은 동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다. 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미한다. 자바, C #, 그리고 일부 스크립트 언어들은 처음부터 쓰레기 수집 기법을 염두에 두고 설계되어, 언어 정의에 쓰레기 수집이 포함되어 있다. C, C 등의 프로그래밍 언어는 수동 메모리 관리를 가정하고 설계되었으나, 쓰레기 수집을 지원하는 구현도 존재한다. D와 같은 어떤 언어들은 쓰레기 수집을 지원하지만, 필요에 따라 쓰레기 수집을 하지 않고 수동으로 메모리를 관리할 수 있다. 장단점 [ 편집 ] 쓰레기 수집이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다. 쓰레기 수집은 다음과 같은 버그를 줄이거나 완전히 막을 수 있다. 유효하지 않은 포인터 접근 : 이미 해제된 메모리에 접근하는 버그를 가리킨다. 만약 이 포인터가 해제되고 새로운 값이 할당되었다면, 잘못된 값을 읽어오게 된다. 이중 해제 : 이미 해제된 메모리를 또다시 해제하는 버그를 가리킨다
##로 문제 단편화 메모리 누수 도달할 수 없는 메모리 기타 자동 변수 메모리 관리에 대한 국제 심포지엄 지역별 메모리 관리 전거 통제 GND : 4269286 - 6 원본 주소 " " 분류 : 메모리 관리숨은 분류 : 출처가 필요한 글 / 2010년 9월출처가 필요한 모든 글전체에 출처가 필요한 글영어 표기를 포함한 문서GND 식별자를 포함한 위키백과 문서 둘러보기 메뉴 개인 도구 로그인하지 않음토론기여계정 만들기로그인 이름공간 문서토론 변수 보기 읽기편집역사 보기 더 보기 검색 둘러보기 대문사용자 모임요즘 화제최근 문서 보기임의 문서로도움말기부 도구 여기를 가리키는 문서가리키는 글의 최근 올리기특수 문서 목록고유 링크문서 정보위키데이터 항목이 문서 인용하기 인쇄 / 내보내기 책 만들기PDF로 다운로드인쇄용 판 다른 언어 IndonesiaItaliano 日 本 語 / 中 文 링크 편집 이 문서는 2018년 9월 8일 ( 토 ) 19 : 12에 마지막으로 편집되었습니다. 모든 문서는 크리에이티브 커먼즈 저작자표시 - 동일조건변경허락 3. 0에 따라 사용할 수 있으며, 추가적인 조건이 적용될 수 있습니다. 자세한
##었다면, 잘못된 값을 읽어오게 된다. 이중 해제 : 이미 해제된 메모리를 또다시 해제하는 버그를 가리킨다. 일부 메모리 할당 알고리즘에서는, 해제된 메모리를 다시 해제하려고 시도하는 것은 오류를 일으킬 수 있다. 메모리 누수 : 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그를 가리킨다. 메모리 누수가 반복되면 메모리 고갈로 프로그램이 중단될 수 있다. ( 접근 가능한 메모리가 증가하여 메모리가 고갈되는 문제는 쓰레기 수집으로도 막을 수 없다 ) 반면, 쓰레기 수집 기법은 다음과 같은 단점을 갖고 있다. 어떤 메모리를 해제할지 결정하는 데 비용이 든다. 객체가 필요없어지는 시점을 프로그래머가 미리 알고 있는 경우에도 쓰레기 수집 알고리즘이 메모리 해제 시점을 추적해야 하므로, 이 작업은 오버헤드가 된다. 쓰레기 수집이 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다. 때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다. 이런 특성은 특히 실시간 시스템에는 적합하지 않다. 할당된 메모리가 해제되는 시점을 알 수 없다. 자원 할당과 변수 초기화를 일치하는 RAII ( Resource Acquisition is Initialization ) 스타일의 프로그래밍에서는, 이것은 자원 해제 시점을 알 수 없다는 것
##적인 장점을 가지고 있다. 해제된 후 재사용 가능한 영역과 사용 중인 영역을 표시하기 위해 추가적인 작업을 할 필요가 없다. 따라서 해제된 영역을 포인터로 관리하는 방식에 비해 할당과 해제가 빠르게 이루어진다. 할당된 메모리들이 단편화되는 것을 막을 수 있다. 연결 리스트와 같은 연결형 자료구조에서, 서로 연결된 객체들이 메모리 상에서 가까운 위치에 할당될 확률이 높아진다. 이는 캐시와 관련하여 성능 향상에 도움이 된다. 반면, 메모리 이동 기법은 주기적으로 포인터의 내용이 바뀌므로 포인터 연산을 사용할 수 없게 된다는 단점이 있다. 세대 단위 쓰레기 수집 [ 편집 ] 많은 연구자들은 프로그램에서 새롭게 할당된 영역일수록 금방 해제될 확률이 높다는 관찰을 보고하였다. 세대 단위 쓰레기 수집 기법은 이런 특성을 이용하여, 각각의 객체를 할당된 시간에 따라 세대별로 구분하여, 각 세대별로 서로 다른 메모리 영역에 객체를 할당한다. 만약 한 세대의 메모리 영역이 꽉 차면, 이 메모리 영역에서 살아남은 객체를 더 오래된 메모리 영역으로 옮긴다. 새로 할당된 영역에서는 대부분의 객체들이 빠르게 해제되고 오래된 영역에서는 객체들이 변하지 않을 확률이 높으므로, 이 기법은 메모리의 일부 영역만을 주기적으로 수집하게
동일조건변경허락 3. 0에 따라 사용할 수 있으며, 추가적인 조건이 적용될 수 있습니다. 자세한 내용은 이용 약관을 참고하십시오. 미국 및 다른 국가에 등록되어 있는 Wikimedia Foundation, Inc. 소유의 등록 상표입니다. 개인정보 정책 위키백과 소개 면책 조항 개발자 쿠키 정책 모바일 보기
##에 표시를 위해 1 비트의 메모리를 남겨 둔다. 표시 단계에서, 모든 변수가 가리키는 영역을 " 사용 중 " 으로 표시하고, 그 영역에서 가리키는 또다른 영역 또한 " 사용 중 " 으로 표시한다. 이와 같이 모든 메모리 영역을 표시하고 나면, 표시되지 않은 영역을 접근 불가능한 메모리 영역이 된다. 접근 불가능한 메모리 영역들을 쓸기 단계에서 모두 해제한다. 이 기법의 단점은, 표시 단계에서 메모리 내용이 변경되지 않아야 하기 때문에 전체 시스템의 실행이 정지된다는 것이다. 또한 전체 메모리 영역을 검사해야 하므로 메모리 페이징을 사용하는 운영체제에서 프로그램의 성능이 저하될 수 있다. 삼색 표시 기법 [ 편집 ] 표시하고 쓸기 기법의 단점을 보완하기 위해, 많은 언어들은 삼색 표시 기법을 사용한다. 삼색 표시 기법은 기본적으로 표시하고 쓸기와 같은 기법이지만, 표시 단계에서 2가지가 아닌 3가지 ( 흰색, 회색, 검은색 ) 정보 중 하나로 메모리를 표시한다. 이 기법은 다음과 같은 순서로 이루어진다. 각각의 객체를 흰색, 회색, 검은색으로 분류한다. 흰색은 더이상 접근 불가능한 객체를 가리킨다. 회색은 접근 가능한 객체이지만, 이 객체에서 가리키는 객체들은 아직 검사되지 않았음을 의미한다. 검은색은 이 영역에서
Resource Acquisition is Initialization ) 스타일의 프로그래밍에서는, 이것은 자원 해제 시점을 알 수 없다는 것을 의미한다. 포인터 추적 방식 [ 편집 ] 대부분의 쓰레기 수집 기법은 포인터 추적 방식을 사용한다. 포인터 추적 방식은 한 개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고, 그 밖의 메모리를 해제하는 방식을 가리킨다. 접근 가능한 객체 [ 편집 ] 접근 가능한 객체는 어떤 변수가 직접 가리키는 메모리, 또는 간접적으로 가리키는 메모리를 의미한다. 접근 가능한 메모리는 다음과 같이 재귀적으로 정의할 수 있다. 변수가 가리키는 객체. 여기서 변수는 콜 스택에서 정의된 지역 변수와 전역 변수를 모두 포함한다. 접근 가능한 객체가 가리키는 모든 객체는 마찬가지로 접근 가능하다. 여러가지 포인터 추적 기법 [ 편집 ] 포인터 추적 기법에는 여러가지 변종이 존재한다. 어떤 언어들은 다음 기법들 가운데 여러가지 전략을 함께 사용하기도 한다. 표시하고 쓸기 ( mark and sweep ) [ 편집 ] 표시하고 쓸기 기법은 포인터 추적 기법 가운데 가장 단순한 기법이다. 먼저 각 메모리 할당 영역에 표시를 위해 1 비트의 메모리를 남겨 둔다. 표시 단계에서, 모든 변수가 가리키는 영역을 " 사용 중 " 으로 표시하고
. 예를 들어 하드 디스크 블록의 할당과 해제를 담당하는 파일시스템의 경우, 포인터 추적 방식의 쓰레기 수집은 디스크라는 매체의 특성 상 오랜 시간을 소모하게 된다. 그러나 참조 횟수 계산 방식은 할당된 블록을 해제하는 시점에 해당 블록을 가리키는 포인터가 운영체제의 버퍼에 로딩되어 있으므로, 빠르게 블록을 해제할 수 있다. 반면 참조 횟수 계산 방식에는 다음과 같은 단점이 있다. 두개 이상의 객체가 서로를 가리키고 있을 경우, 참조 횟수가 0이 되지 않게 된다. 이를 순환 참조라고 하며, 메모리 누수의 원인이 된다. CPython은 이 문제를 해결하기 위해 순환 참조를 감지하는 알고리즘을 사용한다. 또한 자료구조에서 약한 참조 ( 참조 횟수를 증가시키지 않는 포인터 ) 를 사용하여 이 문제를 해결할 수도 있다. 멀티스레드 환경에서는, 스레드간에 공유하는 객체의 참조 횟수 계산을 위해 원자적 명령을 사용하거나 락을 걸어야 한다. 이 문제를 회피하기 위해 스레드 단위 지역 변수로 참조 횟수를 따로 관리하면서, 스레드의 참조 횟수가 0이 될때만 전역 참조 횟수를 확인하는 방식을 사용할 수 있다. 리눅스 커널에서 이 방식을 사용한다. 참조 횟수가 0
수집을 지원하며, 파이썬, PHP 등의 언어는 참조 횟수 계산 방식을 사용한다. 프로그래밍 초보자를 위해 설계된 베이직 등의 언어 또한 까다로운 메모리 관리를 자동으로 지원하기 위해 쓰레기 수집 기법을 사용한다. 초창기 마이크로컴퓨터에서 구현된 베이직의 경우 쓰레기 수집이 이뤄지는 동안 프로그램이 오랫동안 정지하는 등의 동작을 보였다. 같이 보기 [ 편집 ] 메모리 관리 메모리 누수 참조 횟수 계산 방식 각주 [ 편집 ] ↑ " Recursive functions of symbolic expressions and their computation by machine, Part I ". 2013년 10월 4일에 원본 문서에서 보존된 문서. 2012년 11월 13일에 확인함. vdeh메모리 관리운영 체제의 기능으로서의 메모리 관리직접 메모리 관리 정적 메모리 할당 C 동적 메모리 할당 new 와 delete 가상 메모리 요구 페이징 페이지 테이블 페이징 가상 메모리 압축 하드웨어 메모리 관리 장치 변환 색인 버퍼 쓰레기 수집 보엠 쓰레기 수집기 파이널라이저 쓰레기 표시 정리 알고리즘 참조 횟수 계산 방식 강한 참조 약한 참조 메모리 세그먼트 보호 모드 리얼 보드 가상 86모드 x86 메모리 분할 메모리 보안 버퍼 오버플로 버퍼 오버리드 허상 포인터 스택 오버플로 문제 단편화 메모리 누수 도달할 수 없는 메모리 기타 자동 변수 메모리 관리에 대한 국제 심포지엄 지역별 메모리 관리 전거 통제 GND
쓰레기 수집(garbage collection 가비지 컬렉션[*], GC)은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 영어를 그대로 읽어 가비지 컬렉션이라 부르기도 한다. 1959년 무렵 리스프의 문제를 해결하기 위해 존 매카시가 개발하였다.