46 lines
3.5 KiB
Markdown
46 lines
3.5 KiB
Markdown
가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 **Heap 영역**에서 **동적으로 할당했던 메모리** 중 **필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거**하는 프로세스를 말한다.
|
|
|
|
C / C++ 언어에서는 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 했었다.
|
|
|
|
반면 Java에서는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 관리하지 않아도 되어 오롯이 **개발에만 집중**할 수 있다는 장점이 있다.
|
|
|
|
예시를 들자면 다음과 같은 조금 억지스러운(?) 코드를 실행한다고 가정하자.
|
|
```java
|
|
for (int i = 0; i < 10000; i++) {
|
|
NewObject obj = new NewObject();
|
|
obj.doSomething();
|
|
}
|
|
```
|
|
|
|
루프문에 의해서 10000 건의 NewObject 객체는 for문 스코프 내에서 생성되고 사용되지만, 루프가 끝나고 루프 밖에서는 더이상 사용할 일이 없어진다.
|
|
|
|
만일 이런 객체들이 메모리를 계속 점유하고 있다면, 다른 코드를 실행하기 위한 메모리 자원은 지속적으로 줄어들기만 할 것이다. 하지만 우리는 이에 대해서 별다른 작업을 하지 않고 구현 코드를 이어 나간다.
|
|
|
|
이것이 가능한 이유는, 가비지 컬렉션(GC)이 한번쓰이고 버려지는 객체들을 주기적으로 비워줌으로써 한정된 메모리를 효율적으로 사용할 수 있게 해주기 때문이다.
|
|
|
|
또한 가비지 컬렉션(GC)는 꼭 자바(Java)에만 있는 개념이 아니다.
|
|
|
|
파이썬, 자바스크립트, Go 언어 등 **많은 프로그래밍 언어에서 가비지 컬렉션이 기본으로 내장**되어 있다.
|
|
|
|
당장 여러분이 보고있는 이 브라우저 역시도 자체적으로 구현된 가비지 컬렉션이 있기 때문에 별다른 메모리 관리 없이 웹페이지를 만들수 있는 것이다.
|
|
|
|
따라서 이번 시간에 가비지 컬렉션에 대해 제대로 학습한다면, 자바 외의 언어의 가비지 컬렉션 동작에 대해서도 어느정도 통달되었다고 말할 수 있다.
|
|
|
|
그러나 이런 만능 같은 가비지 컬렉션에도 **단점**이 존재한다.
|
|
|
|
자동으로 처리해준다 해도 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 **오버헤드**가 발생되는 문제점이 있다.
|
|
|
|
이를 전문적인 용어로 **Stop-The-World** 라 한다.
|
|
[[STW (Stop The World)]]
|
|
|
|
따라서 이 시간을 최소화 시키는 것이 쟁점이다.
|
|
|
|
이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 하다.
|
|
|
|
예를들면 익스플로러는 이 가비지 컬렉션를 너무 자주 실행하여 성능 문제를 일으키는 것으로 악명이 높았다.
|
|
|
|
이런 특성에 따라 실시간 성이 매우 강조되는 포로그램일 경우 가비지 컬렉터(GC)에게 메모리를 맞기는 것은 맞지 않을 수 있다.
|
|
|
|
따라서 어플리케이션의 사용성을 유지하면서 효율적이게 GC를 실행하는 최적화 작업이 개발자의 숙제가 된다.
|
|
|
|
그리고 이러한 GC 최적화 작업을 [[GC Tuning]]이라고 한다. |