JVM은 클래스파일을 실행시키는 것 외에도 다른 많은 작업들을 한다. 그 중 대표적으로 JIT 컴파일러[프로그래밍 언어, 컴파일러, 인터프리터 참고]가 있고, 또 가비지 컬렉터(Garbage Collector), 즉 메모리 관리가 있다. (다른것도 많다.)
가비지컬렉터는 우리가 인풋으로 준 클래스파일을 실행하는 도중에 실행되며 Heap공간에서 더이상 참조(reference)되지 않는 메모리 공간을 수거한다.
JVM의 GC 알고리즘의 중요 목적은 크게 두가지로 나눌 수 있다.
1) 어떻게 불필요한 object들을 선별 하는 가
2) GC가 동작하는 동안 프로그램이 중단 되는 시간을 어떻게 줄 일 수 있는가
이 목적을 달성하기 위해 GC는 불필요한 Object를 발견하고 해당 메모리 주소를 되 찾는(Reclaim) 방법으로 Mark and Sweep 알고리즘을 사용한다.
필요한 Object를 표시 한다. 이러한 작업을 하기 위해 Garbage Collection Root(일명, GC Root)라고 불리는 특별한 Object를 계속 추적한다.
GC Root는 현재 실행 되고 있는 Method에 local variable이 될 수 도 있고 혹은 로드된 클래스의 static variables일 수도 있다.
Mark and Sweep 알고리즘가 돌고 있는 동안 GC는 모든 GC Root 그래프를 돌아 다니면서 필요한 Object를 발견 하기 위해 노력한다.
위의 그림은 GC Root 그래프이다. 보라색으로 표시된건 참조되어 있는 Object이고 빨간색으로 표시되어 있는 건 특정 시기에는 참조 되어있지만 현재는 범위를 벗어나 참조되지 않는 Object들이다.
그래프를 돌고 난 후 마크되지 않은(참조 되지 않는 Objects) 를 메모리에서 지우고 해당 메모리 공간을 되 찾는다.
만약 GC가 작동 할때 프로그램을 중단시키지 않으면 Object를 관리할때 새로운 Object가 생성 될 지 모른다. 해당 Object는 현재 GC가 동작하고 있는 Object들과 서로 연결되지 않을 가능성이 높고 그로인해 GC는 생성된 Object의 주소값을 지울 것이다.
https://imasoftwareengineer.tistory.com/103 [삐멜 소프트웨어 엔지니어]