💡가비지 컬렉션(Garbage Collection) 이란?
프로그램에서 동적으로 할당된 메모리 중에서 더 이상 사용하지 않는 메모리를 탐지하고 해제하는 자동화된 메모리 관리 기술이다.
사용 이유
프로그램에서 메모리를 사용하다보면, 메모리를 해제하는 코드를 작성하지 않으면 사용되지 않는 메모리가 계속 쌓여서 메모리 누수(Memory leak)가 발생할 수 있다.
이러한 문제를 해결하기 위해서 가비지 컬렉션은 필수적이다.
가비지 컬렉션은 프로그램에서 사용 중인 메모리 영역에서 더 이상 사용하지 않는 객체(인스턴스)를 탐지하고, 자동으로 해당 객체가 차지하고 있는 메모리를 해제한다. 이 과정에서 프로그램이 일시 중단되는 시간(Stop the World)이 발생할 수 있으며, 이 시간이 길어지면 성능 문제가 발생할 수 있다.
동작 매커니즘
가비지 컬렉션의 매커니즘은 크게 두 가지 방법으로 구현된다.
참조 카운팅(Reference counting) 기법
- 객체가 참조될 때마다 카운트를 증가시키고, 해당 객체를 가리키는 포인터가 없어지면 카운트를 감소시키는 방법이다. 카운트가 0이 되면 해당 객체를 해제하는 방식이다.
마크 앤 스위프(Mark and Sweep) 기법
- 사용 가능한 메모리를 추적하고, 참조되는 객체를 표시(Mark)한다. 그리고 마크되지 않은 객체들은 사용 가능한 메모리로 판단하고, 해당 객체가 차지하는 메모리를 해제한다.
주의 사항
- 객체를 사용한 후, 더 이상 해당 객체를 사용하지 않을 때는 해당 객체의 참조를 null로 초기화해야 한다
- 순환 참조(Reference cycle)를 피해야 한다. 예를 들어, 두 개의 객체가 서로를 참조하는 경우에는, 하나의 객체만이 다른 객체를 참조하도록 하여, 한 객체가 다른 객체를 참조하지 않도록 한다.
Example
가비지 컬렉션으로도 메모리 leak이 발생될 때.
public class MyClass {
private List list = new ArrayList<>();
public void addToMyList(String str) {
list.add(str);
}
public static void main(String[] args) {
MyClass myClass = new MyClass();
for (int i = 0; i < 1000000; i++) {
myClass.addToMyList("string" + i);
}
}
}
List 변수를 지역 변수로 선언하여 메모리 누수를 방지.
public class MyClass {
public void addToMyList(List list, String str) {
list.add(str);
}
public static void main(String[] args) {
List list = new ArrayList<>();
MyClass myClass = new MyClass();
for (int i = 0; i < 1000000; i++) {
myClass.addToMyList(list, "string" + i);
}
}
}
reference.
'🗂️CS & Other' 카테고리의 다른 글
[ColorScripter] 글 작성 시 소스코드 디자인 변경 (8) | 2023.10.26 |
---|---|
[SSO] SSO(Single Sign-On) 개념 정리 (6) | 2023.10.20 |
[디지털 공학 응용] 중간 시험 (6) | 2023.10.18 |
[CS] Regular Expression. 정규 표현식 (0) | 2023.09.23 |