가비지 컬렉터, 왜 알아야하는가 - 4. Dart의 가비지 컬렉터

삼콩·2023년 4월 21일
0

가비지 컬렉션

목록 보기
4/4

본 시리즈는 팀 내 작디 작은 세미나에서 발표했던 내용으로 이루어져 있습니다.
우아한 테코톡의 던님의 영상Aaron Yoo 유튜버의 영상 내용을 주로 참고했습니다!
오류가 있다면 댓글로 남겨주시면 감사하겠습니다!

이번 시리즈의 마지막 글은 다트의 가비지 컬렉션입니다. 다트의 가비지 컬렉션에 대해서는 이전에 심화해서 쓴 글이 있는데 먼저 읽고 이 글을 보시면 도움이 될거에요! 다트에서는 Generational Garbage Collection과 mark and sweep을 사용했었죠

다트에서는 세대가 old와 young으로 나뉘어져 있었고, young generation에서 Young Space Scavenger가 수행됐습니다.


다트의 young space는 둘로 나뉘어져있었습니다. 앞에서 본 자바의 survivor0과 1 처럼 동작하죠.

새로운 객체들은 활성화된 반쪽에 할당되며, 활성화된 반쪽이 가득 차면, 이중 살아있는 객체들은 비활성화된 반쪽으로 복사되었죠.

old generation에서는 마크앤 스윕 알고리즘이 적용이 되었죠.

하지만 우리가 앞에서 살펴본 자바와 파이썬의 마크앤스윕 알고리즘은 스탑더월드 상태가 빈번하게 발생했지만, 다트는 달랐습니다. hook을 통해 엔진에 의해 앱이 현재 실행되지 않고, 작동하지 않는 상태, 유저 상호작용이 없는 때를 감지해서 gc가 성능에 영향을 끼치지 않은채 실행된다는 점이 큰 차이였습니다. 이러한 알고리즘을 점진적 가비지 컬렉션이라고도 부르는데요, 다트는 어떻게 이것이 가능할까요?


Dart VM에서는 일정한 간격으로 샘플링을 수행합니다. Sampling은 프로그램의 실행을 중단시키지 않으며, 성능 분석 및 디버깅에 매우 유용한데요, 이를 통해 프로그램의 성능을 개선하고, 메모리 사용량을 최적화할 수 있습니다.아무튼 이 때, 샘플링된 정보를 바탕으로 앱이 현재 idle 상태인지 판단합니다. 우리도 해당 샘플링된 정보를 확인할 수 있는데 다트 데브툴에서 몰 엑션즈를 클릭해 observatory로 들어가면 다음과 같은 화면이 뜹니다.

여기서 Timeline 탭으로 들어가서 확인할 수 있는데요, 이 탭에서는 애플리케이션이 실행되는 동안 발생한 이벤트들을 시간별로 나열하여 보여줍니다. "Frames" 뷰를 선택한 후, "Idle" 항목을 찾아봐야 합니다. Idle 상태에서는, 화면이 업데이트되는 프레임이 없으므로, Frames 뷰에서는 "Idle" 항목이 화면 전체를 차지하게 됩니다. "Idle" 항목의 색상은 보통 회색으로 나타나며, 이를 통해 애플리케이션이 Idle 상태인지 쉽게 파악할 수 있다고 합니다.

그렇게 앱이 중지 상태로 판단된 경우, Dart VM에서는 Hooking을 수행합니다. Hooking은 Dart VM에서 앱을 실행할 때, 코드의 특정 지점에서 코드 실행을 중지시키고, Dart VM에서 제공하는 훅(Hook) 함수를 실행합니다. Hooking 함수에서는 garbage collection을 수행하게 됩니다. 이 방식을 통해 다트는 블록되지 않고 사용자와 상호작용을 계속 할 수 있습니다.

위의 표에서 확인할 수 있듯이, 자바와 파이썬은 일시 정지(stop-the-world) 방식을 사용하여 gc를 실행하며, gc 실행 시 애플리케이션이 일시적으로 멈춥니다. 반면에 다트는 incremental 방식을 사용하여 gc를 실행하며, gc 실행 시 애플리케이션이 멈추지 않으므로 성능에 영향을 덜 줍니다. 또한, 파이썬은 참조 카운트(reference count) 방식을 사용하여 gc를 실행하는 반면, 자바와 다트는 mark-and-sweep 알고리즘을 사용합니다. 비슷한 알고리즘을 사용해 gc를 수행하지만 각기 어떤 알고리즘과 함께 쓰이는지와 또 가상머신이 어떤걸 제공해주느냐에 따라 굉장히 차이가 많이 난다는 것을 알 수 있습니다.

가비지 컬렉션에 대해 공부하면서 각 언어별로 메모리 구조나 런타임 환경 등에 대해 알 수 있었던 시간이였습니다. 기본적인 알고리즘은 공통적이고 각 언어의 특성에 따라 다양하게 발전된 가비지 컬렉터의 모습도 재미있었습니다. 이 시리즈를 읽어주셔서 감사합니다 :-)

참고한 글
https://luavis.me/python/dismissing-python-garbage-collection-at-instagram
https://medium.com/dmsfordsm/garbage-collection-in-python-777916fd3189

profile
프론트엔드 세계의 모략을 꾸미는 김삼콩입니다

0개의 댓글