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

삼콩·2023년 4월 21일
0

가비지 컬렉션

목록 보기
2/4

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


지난 글에서 가비지 컬렉션의 주요 알고리즘을 살펴 보았습니다. 이제 실제 언어별로 어떤 알고리즘을 채택해 사용하는지 알아보도록 하겠습니다. 첫빠따는 자바입니다. 자바는 우리가 앞서 공부한 마크앤 스윕과 세대별 가비지 컬렉션을 사용합니다. 마크앤 스윕에서 루트라고 불렀던, 논 힙 영역에 해당하는 애들이 자바에서는 무엇인지 예시 코드를 통해 살펴보도록 하겠습니다.

자바의 메모리 영역에는 스택 영역과 힙 영역이 존재합니다.

스택은 정적으로 할당한 메모리 영역으로 원시 타입의 데이터가 값과 함께 할당이 됩니다. 힙영역에 생성된 오브젝트 타입의 데이터의 참조 값이 할당이 되고,함수가 호출될 때 사용하는 메모리이며 기능 수행이 끝나면 자동으로 반환되는 메모리입니다. 이렇게 말하면 헷갈리니까 이따 예시로 설명해드리겠습니다.

힙은 동적으로 할당한 메모리 영역으로 모든 오브젝트 타입의 데이터가 할당됩니다. 힙 영역의 오브젝트를 가리키는 참조 변수가 스택에 할당이 됩니다. Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지되기 때문에 가비지 컬렉터는 이 힙 영역을 관리해줍니다.

코드의 메인함수가 실행될 때 원시 타입의 데이터 int는 stack에 할당이 되고, 차례대로 sum까지 stack에 할당이 됩니다. 마지막 String타입은 참조형 데이터 타입을 갖는 객체이기 때문에 참조 변수는 스택에, 해당 데이터는 힙에 쌓이게 됩니다. 메인 함수가 끝나고 스택의 메모리는 반환되고, 힙의 메모리는 지워지지 않습니다. 이 때 이 도달할 수 없는 객체를 unreachable 오브젝트라고 합니다. 이 오브젝트가 가비지 컬렉션의 대상이 됩니다. 이 대상은 gc 알고리즘에 따라 수거되게 되는데, 수거되는 시점에 대해서는 힙 메모리의 구조를 더 자세히 들여다 봐야합니다.


세대별 가비지 컬렉션 알고리즘에 따라 자바의 힙 영역은 young 영역과 old 영역으로 나뉘게 됩니다. young은 더욱 효율적인 gc를 위해 이렇게로 3가지로 나뉘게 되는데요. 에덴이라는 이 맨 첫번째 영역은 에덴 동산을 생각하시면 됩니다. 무언가 새로운 객체가 생성됐을 때 이 에덴 영역에 할당이 됩니다.

에덴이 다 사용이 되면, 가비지 컬렉터가 발생합니다. 이 때 동작하는 가비지 컬렉터는 minor gc라고 합니다. 이곳에선 Copying이 수행되고 그 중 살아남은 객체는 서바이벌 0로 복사됩니다. 이동할 때 에덴의 언리처러블 객체는 해제되고 이 과정이 반복하면서 서바이벌 0가 다 찼을 땐 서바이벌 0에 대해 Copying이 일어나게 됩니다. 여기서 살아남은 객체는 1로 이동하게 되고 이 때 age값이 증가하게 됩니다.

이 과정이 반복되어 에덴영역에서 가비지 컬렉터가 발생했을 땐 또 가비지 컬렉터가 동작하는데 어디로 가냐면, 서바이벌 두 영역중에 객체가 차있는 곳으로 갑니다. 따라서 언제나 서바이벌 0이나 1 둘중 하나는 비어있게됩니다. 에덴에서 바로 서바이벌 1으로 왔기 때문에 age가 차이가 나겠죠. 서바이벌 1이 모두 찼을 때 서바이벌 0으로 가게되고 이 때 Copying이 일어나게 됩니다. age가 또 올라가겠죠.

이 과정을 반복하면서 특정 age값을 넘어서면 그 때 old generation으로 복사됩니다. 이 과정을 promotion이라고 합니다. 이 프로모션 과정이 계속해서 일어나서 old generation이 모두 차면 이때 major 가비지 컬렉터가 수행됩니다. major gc에서는 마크앤 스윕 알고리즘에 따라 수행되기 때문에 시간이 오래걸립니다 사실 이 major gc가 수행되는 방식의 세부 방식으로 수많은 방식 등이 있는데 자바 gc를 파기보단 각 언어별 가비지 컬렉션의 동작 원리가 더 중요한 것 같아서 이 부분은 생략했으니 궁금하신 분들은 java의 major gc에 대한 키워드로 서칭하시면 될 것 같습니다.

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

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

0개의 댓글