Garbage Collection in Java
Oracle의 Java Garbage Collection Basics를 참고해 작성했다.
Java에서의 Garbage Collection이란?
먼저 Java에서는 Garbage Collection이 JVM에 의해 자동으로 수행되는데, 위 문서에서는 이를 Automatic Garbage Collection이라고 한다. 그리고 이를 다음과 같이 설명한다.
Automatic garbage collection is the process of looking at heap memory, identifying which objects are in use and which are not, and deleting the unused objects.
여기서 in use object
(혹은 referenced object
)는 프로그램의 일부가 해당 object
에 대한 참조를 유지하고 있는 객체를 말한다.
반대로, unused object
(혹은 unreferenced object
)의 경우 프로그램의 어떤 곳에서도 참조가 되지 않는 객체를 말한다. 따라서 이때 unused object
가 사용하고 있는 메모리는 해제할 수 있다.
어떻게 동작하는걸까?
기본적으로 메모리의 할당(allocating memory)과 해제(deallocating memory)는 C와 같은 프로그래밍 언어에서는 프로그래머에 의해 수동으로 수행된다. 그런데 Java에서는 Garbage Collector에 의해 메모리 해제가 자동으로 수행된다. 이는 기본적으로 다음과 같은 방식으로 동작한다.
1. Marking
![garbage-collector-mark](/img/garbage-collector-mark.png)
Garbage Collector가 현재 메모리 조각이 사용 중인지 아닌지 식별한다.
2. Normal Deletion
![garbage-collector-delete](/img/garbage-collector-delete.png)
Unreferenced objects를 메모리로부터 제거하고, Memory Allocator가 빈 메모리 공간의 주소 리스트를 저장한다.
(2.1). Deletion with Compacting
![garbage-collector-compact-delete](/img/garbage-collector-compact-delete.png)
성능을 추가로 향상시키기 위해, Referenced objects의 메모리 공간을 이동시켜, 이후에 더 빠르게 메모리를 할당할 수 있게 한다.