Java

[Java] GC

parangofsky 2026. 1. 30. 23:44

오늘 포스트에서는 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