C ++ 및 C에는 가비지 수집기가 있습니다. 이것이 C에서 어떻게 작동하는지 확실하지 않지만 C ++에서는 RTTI 를 활용하여 개체 그래프를 동적으로 검색하고이를 가비지 수집에 사용할 수 있습니다.
내 지식으로는 Java를 작성할 수 없습니다. 가비지 수집기없이. 약간의 검색으로 이 가 나타났습니다.
Java와 C / C ++의 주요 차이점은 C / C ++에서 선택은 항상 귀하의 것이라는 점입니다. , 반면 Java에서는 설계 상 옵션이없는 경우가 많습니다.
댓글
또한 전용 가비지 수집기가 더 잘 구현되고 더 효율적입니다. 언어에 더 잘 맞습니다. 🙂
아니요. ' RTTI를 사용하여 C / C ++에서 개체 그래프를 동적으로 검색 할 수 없습니다. It '는 모든 것을 망칠 수있는 일반 오래된 데이터 개체입니다. 가비지 수집기가 해당 개체 내에서 포인터와 비 포인터를 구분할 수 있도록하는 일반 오래된 데이터 개체에 저장된 RTTI 정보가 없습니다. 더 나쁜 것은 포인터가 모든 하드웨어에서 완벽하게 정렬 될 필요가 없기 때문에 16 바이트 객체가 주어지면 64 비트 포인터를 저장할 수있는 9 개의 가능한 위치가 있으며 그 중 2 개만 저장할 수 있습니다. ' 겹치지 않습니다.
답변
성능과 안전 간의 균형입니다.
가비지가 Java로 수집된다는 보장은 없습니다. 오랜 시간 동안 공간을 사용하고있을 수 있지만 참조되지 않은 개체 (예 : 쓰레기)를 검색하는 것은 사용하지 않는 개체를 명시 적으로 삭제하거나 해제하는 것보다 더 오래 걸립니다.
물론 장점은 다음과 같습니다. 포인터없이 또는 메모리 누수없이 언어를 빌드 할 수 있으므로 올바른 코드를 생성 할 가능성이 더 높습니다.
때로는 이러한 논쟁에 약간의 “종교적”우위가있을 수 있습니다. 경고를 받으십시오!
답변
다음은 C와 같은 시스템 언어에서 사용할 수 없게 만드는 GC 고유의 문제 목록입니다.
GC는 자신이 관리하는 객체를 소유 한 코드 수준 아래에서 실행되어야합니다. 커널에는 그러한 수준이 없습니다.
GC는 관리 코드를 수시로 중지해야합니다. 이제 커널에 그렇게하면 어떻게 될지 생각해보십시오. 컴퓨터의 모든 처리는 예를 들어 밀리 초 동안 중지되고 GC는 기존의 모든 메모리 할당을 스캔합니다. 이것은 엄격한 실시간 요구 사항에 따라 작동하는 시스템을 생성하려는 모든 시도를 중단합니다.
GC는 포인터와 비 포인터를 구별 할 수 있어야합니다. 즉, 존재하는 모든 메모리 객체를 볼 수 있어야하며 포인터를 찾을 수있는 오프셋 목록을 생성 할 수 있어야합니다.
이 발견은 완벽해야합니다. GC는 가능해야합니다. 발견 한 모든 포인터를 추적합니다. 거짓 긍정을 역 참조하면 충돌 할 가능성이 있습니다. 거짓 부정을 발견하지 못하면 “아직 사용중인 객체를 파괴하여 관리 코드를 손상 시키거나 데이터를 조용히 손상시킬 수 있습니다.
이렇게하려면 모든 단일 항목에 유형 정보를 저장해야합니다. 그러나 C와 C ++ 모두 유형 정보가없는 평범한 오래된 데이터 객체를 허용합니다.
GC는 본질적으로 느린 비즈니스입니다. Java와 사회화 한 프로그래머 이를 인식하지 못할 수도 있지만 프로그램은 Java로 구현되지 않으면 훨씬 더 빨라질 수 있습니다. Java를 느리게 만드는 요인 중 하나는 GC입니다. 이것이 Java와 같은 GCed 언어가 슈퍼 컴퓨팅에서 사용되는 것을 배제하는 이유입니다. 연간 전력 소비로 백만 달러가 들기 때문에 가비지 수집 비용의 10 %도 지불하고 싶지 않습니다.
C 및 C ++는 지원을 위해 만들어진 언어입니다. 가능한 모든 사용 사례. 그리고 보시다시피 이러한 사용 사례 중 상당수는 가비지 수집에서 제외됩니다. 따라서 이러한 사용 사례를 지원하기 위해 C / C ++는 가비지 수집 될 수 없습니다.