자기개발/검색한 자료 정리

Java와 JavaScript의 가비지 컬렉션 동작 원리 비교

실버블렛 2023. 4. 25. 15:00
반응형

Java와 JavaScript의 가비지 컬렉션 동작 원리 비교

가비지 컬렉션(Garbage Collection)은 프로그래밍 언어에서 메모리를 자동으로 관리해주는 기능입니다. 이 글에서는 Java와 JavaScript에서 가비지 컬렉션의 동작 원리를 비교하며 언어별 차이점을 알아보겠습니다.

Java의 가비지 컬렉션 동작 원리

Java는 가비지 컬렉션 기능을 통해 사용되지 않는 객체를 메모리에서 자동으로 제거합니다. Java의 가비지 컬렉터는 다음과 같은 동작 원리를 가집니다.

  1. 참조 추적: Java의 가비지 컬렉터는 객체가 더 이상 사용되지 않는지를 파악하기 위해 참조 추적을 사용합니다. 객체에 대한 참조가 없다면, 해당 객체는 가비지 컬렉션 대상이 됩니다.
  2. 분대기별 알고리즘: Java의 가비지 컬렉터는 Young(새로 생성된 객체), Old(생명주기가 긴 객체), Permanent(클래스 및 메서드 정보) 영역으로 나누어 메모리를 관리합니다. 각 영역별로 적합한 알고리즘을 사용하여 메모리를 회수합니다.
  3. Stop-the-world: Java의 가비지 컬렉션은 일시적으로 애플리케이션의 실행을 중단시키며(Stop-the-world), 이 시간 동안 가비지 컬렉션 작업이 진행됩니다.

JavaScript의 가비지 컬렉션 동작 원리

JavaScript는 웹 브라우저의 엔진 내에서 가비지 컬렉션 기능을 제공합니다. JavaScript의 가비지 컬렉터는 다음과 같은 동작 원리를 가집니다.

  1. 참조 추적: JavaScript의 가비지 컬렉터는 Java와 마찬가지로 참조 추적 방식을 사용합니다. 객체에 대한 참조가 없다면 해당 객체는 가비지 컬렉션 대상이 됩니다.
  2. 표시-정리(Mark and Sweep) 알고리즘: JavaScript에서는 표시-정리 알고리즘을 사용하여 메모리를 회수합니다. 이 알고리즘은 먼저 모든 객체를 검사하여 도달 가능한 객체를 표시한 후, 표시되지 않은 객체를 메모리에서 제거하는 방식으로 작동합니다.
  3. 증가-정리(Incremental Garbage Collection) 기능: JavaScript의 가비지 컬렉션은 일부 브라우저에서 증가-정리 기능을 제공하여, 가비지 컬렉션 작업을 작은 단위로 분할하여 실행합니다. 이 방식은 애플리케이션의 실행을 일시적으로 중단시키는 Stop-the-world 시간을 줄이는 데 도움이 됩니다.

Java와 JavaScript의 가비지 컬렉션 차이점

비록 Java와 JavaScript의 가비지 컬렉터가 참조 추적 방식을 사용하긴 하지만, 두 언어의 가비지 컬렉션 동작 원리에는 몇 가지 차이점이 있습니다.

  1. 메모리 영역 구분: Java는 메모리 영역을 세부적으로 구분하여 분대기별 알고리즘을 사용하지만, JavaScript는 표시-정리 알고리즘을 사용하여 메모리를 회수합니다.
  2. Stop-the-world 시간: Java의 가비지 컬렉션은 일시적으로 애플리케이션의 실행을 중단시킵니다. 반면, JavaScript의 가비지 컬렉터는 증가-정리 기능을 통해 Stop-the-world 시간을 줄일 수 있습니다.
  3. 환경 차이: Java는 서버, 클라이언트, 모바일 등 다양한 환경에서 동작하며 가비지 컬렉션 전략을 사용자가 선택할 수 있습니다. JavaScript는 웹 브라우저의 엔진 내에서 동작하며 가비지 컬렉션 전략은 브라우저 엔진에 따라 결정됩니다.

결론

Java와 JavaScript에서 가비지 컬렉션의 동작 원리는 비슷하게 참조 추적 방식을 사용하지만, 구체적인 동작 방식과 전략에 차이가 있습니다. 이러한 차이점을 이해하고 적절한 언어를 선택하는 것이 중요합니다. 또한, 가비지 컬렉션에 대한 이해를 통해 메모리 관리를 효과적으로 수행할 수 있습니다.

반응형