java에서는 가비지컬렉터가 자동(?)으로 작동하여 데이터관리를 알아서 해준다고 배웠습니다. c언어와 달리 어떤 원리인가요?

java를 배우던 중 가비지컬렉터라는 개념을 배우게 됐고 c언어에서는 데이터를 직접 관리해줘야하는 반면, java에서는 자동으로 해준다고 배웠습니다.

이런게 어떤 방식으로 가능한 것인가요? 그리고 c언어는 왜 자동으로 관리해주는 것을 지향하지 않는 것인가요?

    1개의 답변이 있어요!

    • 여러가지 이유가 있겠지만 언어의 특징에 따라 GC를 바라보는 관점도 다른 것으로 보입니다.

      1. 첫번째 이유는 언어가 만들어진 시기입니다.
        C언어는 1970년도에 개발되었고 이때는 GC라는 개념도 없었습니다. C++도 이후 1979년도에 bjarne stroustrup이 만들었습니다. 이에 대한 인터뷰가 있으니 한번 읽어보시는 것을 추천해드립니다. https://m.blog.naver.com/PostView.nhn?blogId=imisehi&logNo=150039366592&proxyReferer=https%3A%2F%2Fwww.google.com%2F

      2. 두번째 이유는 언어를 사용한 사람들에 대해서 입니다.
        C언어와 C++를 처음 사용한 시기에는 프로그래머는 매우 소수의 직업이었습니다. 그리고 이들은 대부분 유능해서 거의 수재나 천재에 가까운 인물들이었습니다. 따라서 복잡한 수식과 알고리즘에 정통했고 그들이 메모리를 관리하는데 조그만한 실수를 하는 경우는 많지 않았습니다. 그래서 메모리를 자동화하여 정리할 필요를 느끼지 못했다고 합니다.

      3. 최근에 들어서 C와 C++에서도 GC를 적용하는 프로젝트를 진행했습니다. 많은 분들이 잘 모르셔서 없다고 하시지만 있습니다.
        http://www.hboehm.info/gc/.

      GC의 동작 원리는 Oracle의 튜토리얼 문서에 보면 잘 나와있습니다.

      https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

      GC의 동작원리는 크게 Marking, Normal Deletion, Deletion with Compaction의 단계로 이루어집니다.

      이때 자바의 경우에는 생성된 객체들을 클래스로더라고 부르는 객체의 트리 root에서 사용에 대한 모니터링이 이루어지며
      사용이 없으면 Marking을 해두었다가 GC 알고리즘에 의해 메모리에서 삭제되는 것이 기본 원리입니다.