[CS] GC(Garbage Collector)
카테고리: CS
태그: Programming CS
개요
GC(Garbage Collector)
란 메모리 관리 기법 중 하나로 CLR(Common Language Runtime)
이 제공하는 기능이다.
일반적으로 .NET Framework, .NET Core, Java, Python, C#과 같은 언어는 GC
를 사용한다.
이와 같이 GC
를 사용하는 언어는 대부분 관리 코드 환경에서 사용된다고 하여 Managed 언어
라고 한다.
이와 반대되는 언어들은 대표적으로 C, C++ 언어로 UnManaged 언어
이다.
장점
- 실수 방지
UnManaged 언어
같은 경우 프로그래머가 수동으로 메모리를 관리해야 하기에 실수하면메모리 누수
,이중 해제
,잘못된 포인터 접근
등 이 발생할 가능성이 있으나,GC
를 사용하는Managed 언어
의 경우 스스로 메모리 관리 하기 때문에 실수 가능성이 적다.
- 편리한 개발
GC
가 메모리 관리를 해주기 때문에 프로그래머는 메모리 관리에 대한 복잡한 로직을 작성할 필요가 없어진다. (코드 간소화)
- 스레드 안전성
GC
는 여러 스레드가 동시에 객체 할당 및 해제 작업을 수행할 때, 동기화를 통해 충돌을 방지한다. 이로 인해 스레드 간의 메모리 관리에 대한 복잡한 동기화 작업을 프로그래머가 수행할 필요가 없어지므로 스레드 안전성이 향상된다.
단점
- 예측하기 어려운 동작
GC
는 프로그램 실행 중에 자동으로 작동하며, 프로그래머가 직접 제어할 수 없다. (단 GC 동작을 일부 제어하여 최적화 할 수 있는 방법은 있다.)
- 일시적인 지연 현상
GC
가 수행하기 위해 메모리 상의 사용되지 않는 객체를 식별하고 해제하는 과정을 수행한다. 이 과정에서메인 스레드
를 일시적으로 멈추는데(GC가 안전한 상태에서 메모리 검사를 수행해야 하기 때문이다. 이를Stop-The-World
라고 한다.) 이로 인해 프로그램의 실행이 잠시 중단되는 현상이 발생한다. 만약 처리 해야할 규모가 커지면 중단 현상이 오래 지속 될 수 있다.
동작 방식
GC 대상
GC
는 관리되는 Heap 영역
에서 동적으로 할당했던 메모리 중 더 이상 사용되지 않는 개체(Unreachbale)를 대상으로 회수하는 과정을 수행한다.
GC의 개체 수집 조건
-
시스템의 실제 메모리가 부족한 경우
-
관리되는 Heap의 할당된 개체에 사용되는 메모리가 허용되는 임계값을 초과한 경우
-
GC.Collect 메서드가 호출된 경우
- 거의 모든 경우에
GC
가 지속적으로 실행되므로 이 메서드를 호출할 필요가 없다. 이 메서드는 주로 특이한 상황 및 테스트에 사용된다.
- 거의 모든 경우에
이 조건 중 하나가 충족될 경우 발생한다.
알고리즘
GC
는 다양한 방식의 알고리즘으로 메모리를 관리 하는데 Generational GC, Serial GC, Parallel GC, CMS GC 등이 있는데 그중에서 일반적으로 많이 사용되는 Generational GC
에 대해 알아보려고 한다.
-
Generational GC (세대별 GC)
세대별 GC
는 메모리를 관리하기 위해세대를 0,1,2
로 나눈다. 대부분의 개체가 짧은 수명을 가지고 있으며 오래된 객체일수록 살아남을 확률이 높다는 가정을 기반으로 동작한다. 이를 활용하여GC
의 효율성을 높인다.-
0세대
-
가장 젊고 수명이 짧은 개체를 포함한다. 수명이 짧은 개체의 예로는 임시 변수가 있다.
GC
의 개체 수집은 이 세대에서 가장 자주 발생한다.Minor GC
라고도 한다. -
대부분의 개체는 0세대 수집에서 회수되며 다음 세대까지 남아 있지 않는다.
-
-
1세대
- 0세대 수집에서 남은 개체들은 이 세대로 승격된다. 이 세대는 수명이 짦은 개체를 포함하며 수명이 짧은 개체와 수명이 긴 개체 사이의 버퍼 역할을 한다. 이 세대 또한
Minor GC
에 포함된다.
- 0세대 수집에서 남은 개체들은 이 세대로 승격된다. 이 세대는 수명이 짦은 개체를 포함하며 수명이 짧은 개체와 수명이 긴 개체 사이의 버퍼 역할을 한다. 이 세대 또한
-
2세대
-
1세대 수집에서 남은 개체들이 이 세대로 승격된다. 이 세대는 수명이 긴 개체가 포함된다. 수명이 긴 개체의 예로는 프로세스의 기간동안 유지되는 정적 데이터가 포함된 서버 애플리케이션의 개체가 있다.
-
0세대, 1세대에 비해 상대적으로 드물게 수행되고 시간도 더 많이 소요된다.
Major GC
라고도 한다. -
하나의 세대를 수집한다는 것은 해당 세대와 그보다 더 젊은 세대의 개체를 수집한다는 것을 의미한다. 2세대 가지비 수집은 모든 세대에서 개체를 회수하기 때문에
전체 가비지 수집(Full GC)
이라고도 한다.
-
-
이 알고리즘의 주의점은 세대가 높아질수록 Major GC
를 빈번하게, 나아가 Full GC
가 발생하기에 이는 곧 성능 문제로 이어질 수 있다. 이를 방지하기 위해 큰 개체나 메모리를 많이 사용하는 경우는 필요한 경우에만 생성하고 해제하거나 등 장기간 메모리를 차지하고 있는 개체가 많이 남아있지 않도록 프로그래머가 관리하는 것도 중요하다.
참고 자료
📚 혼자 공부하면서 기록한 공간입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😉
댓글 남기기