[Java] 자바 가비지 컬렉션 기초(Garbage Collection Basic)

Garbage Collection 의 정의

프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함수를 통해 직접 메모리를 해제해주어야 한다. 하지만 Java나 Kotlin을 이용해 개발을 하다 보면 개발자가 메모리를 직접 해제해주는 일이 없다. 그 이유는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해주기 때문이다. 대신 Java에서 명시적으로 불필요한 데이터를 표현하기 위해서 일반적으로 null을 선언해준다.

Test test = new Test();
test.setProgram("JAVA");
test =null;  // Garbage

test = new Test();
test.setProgram("C++");

출처:https://mangkyu.tistory.com/118

JVM의 Heap영역은 처음 설계될때 2가지 전제로 설계되었다.

Stop-the-world

<aside> 💡 Stop-the-world는 GC 실행을 위해 JVM이 어플리케이션 실행을 멈추는 것. 이 stop-the-world가 발생하면 GC를 실행하는 Thread를 제외한 나머지 Thread는 작업을 멈춘다. GC의 과정을 Mark and Sweep 라고 한다. Garbage Collector가 닿을 수 있는 모둔 변수나 객체들을 스캔하면서 어떤 객체를 가리키고 있는지 찾는 과정을 Mark 라고 하고 이 과정에서 stop-the-world가 발생한다. 이후, Mark 가 되어있지 않은 객체들을 Heap 에서 제거하는 과정이 Sweap 이다.

</aside>

가비지 콜럭터는 힙 메모리를 다룬다. Heap은 Young, Old, Perm 으로 나뉘는데 Young 영역에서 발생한 GC 는 Minor GC
나머지 두 영역에서 발생한 GC를 Major GC ( 또는 Full GC ) 라고 한다.

가비지 콜럭터는 힙 메모리를 다룬다. Heap은 Young, Old, Perm 으로 나뉘는데 Young 영역에서 발생한 GC 는 Minor GC 나머지 두 영역에서 발생한 GC를 Major GC ( 또는 Full GC ) 라고 한다.

Minor GC , Major GC

  1. Young
    1. 새롭게 생성한 객체가 위치
    2. 대부분의 객체가 금방 닿을 수 없는 상태가 되기 때문에 많은 객체가 이 영역에서 생성되어 사라진다.