가비지 (컴퓨터 과학)
Garbage (computer science)![]() |
- 가비지는 왜곡된 데이터도 나타낼 수 있다. 데이터 손상 참조.
컴퓨터 과학에서 쓰레기는 컴퓨터 시스템(또는 다른 시스템 자원)의 메모리의 데이터, 물체 또는 다른 영역을 포함하는데, 이는 시스템에 의해 또는 시스템에서 실행되는 프로그램에 의해 향후 어떤 계산에도 사용되지 않을 것이다.모든 컴퓨터 시스템은 메모리의 양이 한정되어 있고, 대부분의 소프트웨어는 쓰레기를 생산하기 때문에, 쓰레기가 차지하는 메모리의 할당을 해제하여, 재사용을 위해 힙, 즉 메모리 풀(memory pool)에 반납하는 것이 자주 필요하다.
분류
가비지는 일반적으로 두 가지 유형으로 분류된다. 즉, 프로그램의 메모리 공간 내에 있지만 프로그램의 루트 집합에서 도달할 수 없는 물체나 데이터, 프로그램 입력의 어떤 조합으로도 실행 중인 프로그램에 의해 접근되지 않는 물체나 데이터의 통사적 쓰레기.쓰레기가 아닌 물체와 데이터는 살아있다고 한다.
무심코 언급하는 통사적 쓰레기는 도달할 수 없는 데이터, 의미적 쓰레기는 도달할 수 없는 데이터다.더 정확히 말하면, 통사적 쓰레기는 참조 그래프(경로가 없음) 때문에 접근할 수 없는 데이터로, 쓰레기 수거 추적에서 논의한 바와 같이 많은 알고리즘에 의해 결정될 수 있으며, 데이터 분석만 필요하며 코드는 필요하지 않다.의미론적 쓰레기는 접근할 수 없는 데이터로, 도달할 수 없지만 접근할 수 없기 때문이다. 이 데이터는 코드의 분석이 필요하며 일반적으로 이해할 수 없는 문제다.
통사적 쓰레기는 (보통 엄격한) 의미적 쓰레기의 부분집합으로, 물체가 그 물체를 사용하지 않고 다른 물체에 대한 참조를 보유하는 것이 전적으로 가능하기 때문이다.
예
Java에서 다음과 같은 간단한 스택 구현에서 스택에서 튀어 나온 각 요소는 일단 외부 참조가 없으면 의미론적 쓰레기가 된다.[a]
공중의 계급 쌓다 { 사유의 오브젝트[] 요소들; 사유의 인트로 사이즈를 맞추다; 공중의 쌓다(인트로 역량) { 요소들 = 새로운 오브젝트[역량]; } 공중의 공허하게 하다 밀다(오브젝트 e) { 요소들[사이즈를 맞추다++] = e; } 공중의 오브젝트 펑펑 터지다() { 돌아오다 요소들[--사이즈를 맞추다]; } }
왜냐하면elements[]
여전히 객체에 대한 참조를 포함하고 있지만, 이 참조를 통해 객체에 다시는 접근하지 못할 것이다.elements[]
학급과 학급의 사적인 것이다.pop
메소드는 아직 튀지 않은 요소에 대한 참조만 반환한다. (사용량이 감소된 후size
이 클래스는 다시는 해당 요소에 액세스하지 않을 것이다.)그러나 이것을 알고 있으려면 반의 코드에 대한 분석이 필요하며, 일반적으로는 해독할 수 없는 것이다.
만약 나중에push
호출하여 스택을 이전 크기로 다시 정렬하고 이 마지막 참조를 덮어쓰면 객체가 통사적 가비지가 되며, 이는 다시 액세스할 수 없기 때문에 가비지 수집이 가능하기 때문이다.
가비지 자동수집
참조 카운트 가비지 수집에 의한 통사적 가비지 자동 수집의 예는 Python 명령줄 통역기를 사용하여 생성할 수 있다.
>>>계급 푸: ... """이것은 빈 시험 수업이다.""" ... 통과하다 ... >>>술집을 내다 = 푸() >>>술집을 내다 <__main__>0x54f30>의 Foo 객체 >>>굴을 파다 술집을 내다
이 세션에서는 객체가 생성되고, 그 위치가 메모리에 표시되며, 객체에 대한 유일한 참조가 파괴된다. 객체에 대한 참조가 없기 때문에 이 시점부터 객체를 다시 사용할 수 있는 방법은 없다.이는 우리가 원래 참조에 접근하려고 할 때 명백해진다.
>>>바 트레이스백(최신 통화):파일 "<stdin>", 줄 1의 ? NameError: 이름 'bar'가 정의되지 않음
이제 그 물체를 언급하는 것이 불가능해졌기 때문에, 그 물체는 쓸모없게 되었다. 그것은 쓰레기였다.Python은 가비지 수집을 사용하기 때문에 객체에 사용된 메모리를 자동으로 할당 해제하여 다시 사용할 수 있도록 한다.
>>>계급 바: ... """이것은 또 다른 시험 수업이다.""" ... 통과하다 ... >>>야유하다 = 바() >>>야유하다 <__main__>0x54f30>의 막대 객체
그바 인스턴스는 이제 메모리 위치 0x54f30에 위치하며, 이전 개체인 Foo 인스턴스가 있던 위치와 동일한 위치에 위치한다.Foo 인스턴스(instance)가 파괴되어, 그것을 포함하는 데 사용된 메모리를 확보했기 때문에, 통역관은 이전과 동일한 메모리 위치에 Bar 객체를 생성하여 가용 자원을 잘 활용한다.
영향들
가비지는 힙 메모리를 소비하므로, 수집하기를 원한다(메모리 사용을 최소화하고, 더 빠른 메모리 할당을 허용하며, 힙 조각화와 메모리 사용을 줄임으로써 메모리 부족 오류를 방지한다).
그러나 쓰레기를 수거하는 데는 시간이 걸리고 수동으로 할 경우 코딩 오버헤드가 필요하다.또한, 가비지를 수집하면 객체가 파괴되어 최종 결정자에 대한 호출을 유발할 수 있으며, 프로그램 실행의 임의 지점에서 잠재적으로 임의의 코드를 실행할 수 있다.잘못된 가비지 수집(가비지가 아닌 메모리를 할당)은 주로 가비지 수집기의 오류가 아닌 수동 가비지 수집의 오류로 인해, 매달린 포인터 사용으로 인한 메모리 안전 위반(보안 구멍을 만드는 경우가 많음)을 초래한다.
통사적 쓰레기는 자동으로 수거할 수 있으며, 쓰레기 수집기는 광범위하게 연구되고 개발되었다.의미론적 쓰레기는 일반적으로 자동으로 수집될 수 없어 쓰레기 수거 언어에서도 기억력 누출을 유발한다.의미론적 쓰레기의 검출과 제거는 일반적으로 힙 프로파일러라는 전문 디버깅 도구를 사용하여 수행되는데, 이 도구를 사용하면 어떤 물체가 활선하고 어떻게 도달 가능한지 알 수 있어 의도하지 않은 참조를 제거할 수 있다.
가비지 제거
쓰레기의 배분을 관리하는 문제는 컴퓨터 공학에서 잘 알려져 있다.다음과 같은 몇 가지 접근법을 취한다.
- 많은 운영 체제는 프로세스나 프로그램이 종료될 때 사용하는 메모리와 자원을 회수한다.이러한 환경에서 실행되도록 설계된 단순하거나 짧은 기간 동안 실행되는 프로그램은 운영 체제가 종료할 수 있으며 필요한 회수를 수행할 수 있다.
- 수동 메모리 관리가 있는 시스템이나 프로그래밍 언어에서 프로그래머는 더 이상 사용되지 않을 때 메모리가 할당 해제되도록 명시적으로 배열해야 한다.C와 C++는 이 모델을 지원하는 잘 알려진 두 언어다.
- 가비지 수집은 다양한 알고리즘을 사용하여 프로그램 상태를 자동으로 분석하고, 가비지를 식별하고, 프로그래머의 개입 없이 할당을 해제한다.자바와 하스켈과 같은 많은 현대 프로그래밍 언어들은 자동화된 쓰레기 수거를 제공한다.그러나 LISP와 같은 구어에도 사용되어 왔기 때문에 최근의 발전은 아니다.
- 프로그램에서 폐기물을 식별하고 제거하기 위한 유형-이론적 접근법(지역 추론 등)에 대한 연구가 진행 중이다.그 문제에 대한 일반적인 유형별 이론적 해결책은 아직 개발되지 않았다.
메모들
외부 링크
- Benjamin Pierce(편집자), 유형 및 프로그래밍 언어의 고급 주제, MIT 프레스(2005) ISBN0-262-16228-8
- 리처드 존스와 라파엘 린스, 쓰레기 수거소: 자동화된 동적 메모리 관리 알고리즘, Wiley and Sons, ISBN 0-471-94148-4