오늘 포스트에서는 GC, 가비지 컬렉터에 대해서 설명해보겠습니다.
GC란?
더이상 사용되지 않는 객체를 자동으로 찾아 메모리(Heap)를 회수하는 JVM의 기능입니다.
개발자가 free()를 직접 호출하지 않아도 되는 이유이기도 합니다.
- GC Root에서 시작해서 참조를 따라가며 도달 가능한 객체는 살려두고
- 그 어디에서도 도달할 수 없는 객체는 가비지(회수 대상) 대상
GC Root 예시
- 실행 중인 스레드의 스택(지역변수/파라미터)
- static 필드
- JNI 참조 등
GC의 대표적 동작
- Mark(표시): 살아있는 객체 표시
- Sweep(청소): 표시되지 않은(죽은) 객체 제거
- Compact(압축): 메모리 단편화를 줄이기 위해 객체를 당겨 정리
finalize() 수동 호출의 단점
finalize()는 GC가 객체를 정리하기 직전에 한 번 호출될 수도 있는 훅을 말합니다. 이는 GC와 관련이 없습니다.
또한, 호출 시점을 예상할 수 없고, 객체 부활같은 부작용이 나타날 수 있습니다.
대신, 파일/소켓/락 같은 “명시적 해제가 필요한 자원”은 try-with-resources + AutoCloseable.close()를 사용합니다.
Q. 변수에 null을 대입하면?
-> 그 변수가 가지고 있던 참조를 끊음 -> GC root로부터 도달 불가능하면 ==> GC대상
단, GC대상이 되었다고 즉시 메모리 회수는 아님. 같은 객체를 다른 곳이 참조할 수 있기 때문에 null 자체가 바로 GC와 연관되지는 않는다.
'Java' 카테고리의 다른 글
| [Java] equals() 와 hashCode() (0) | 2026.02.04 |
|---|---|
| [Java] Stream (0) | 2026.02.03 |
| [Java] Synchronized에 대해 - 2 (0) | 2026.01.26 |
| [Java] Synchronized에 대해 (0) | 2026.01.23 |
| [Java] static - 2 (0) | 2026.01.18 |