JVM에서 더 이상 사용되지 않는 객체들을 모아서 메모리를 해제하는 프로세스이다. 이로써, 개발자는 메모리를 따로 관리할 필요가 없다.
1. Marking
2. Normal Deletion
Allocator
: 메모리를 관리하는 시스템의 한 부분이며, 메모리 할당 및 해제에 대한 책임을 맡고 있다.
3. Compacting
GC가 인식하지 못하는 메모리가 발생할 수 있고 이떄의 메모리가 축적되었을때 나중에 시스템으로 부하가 발생한다.
만약, Stack에서 사이즈를 16으로 맞추었을 때, 새로운 데이터가 들어와서 데이터를 size*2 만큼 늘리고(즉, 32가 되었을 때) 해당 데이터를 pop()으로 삭제한다면 이전에 늘린 사이즈만큼 메모리를 해제하는 것이 아니다. 이때, 메모리 누수가 발생한다.
이때, 다 사용한 변수에 null값을 할당해서 나중에 gc가 가동되었을 때 수거하도록 하는 것이 좋다.
그럼, 다 쓴 변수에 null값을 계속 할당하는 게 좋은가?
아니다. null로 변경하는 것은 예외적인 경우에만 사용하는 것이 좋으며, 다 쓴 객체 참조를 해제하는 가장 좋은 방법은 해당 객체 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다.
메소드 안에서 지역변수로 선언했던 객체는 메소드가 종료되었을때 gc가 수거한다. 그럼 매번, 지역변수로 변수를 선언해서 메모리의 누수를 막아야하는가?
아니다. 개발자는 프로그램의 가독성, 유지 보수성, 코드 구조 등을 고려해서 개발해야 한다.
참고 : https://gyoogle.dev/blog/computer-language/Java/Garbage%20Collection.html