Java의 가비지 컬렉터

Jinjin·2023년 12월 2일
0
post-thumbnail

🔎 가비지 컬렉터(GC)란?

JVM에서 더 이상 사용되지 않는 객체들을 모아서 메모리를 해제하는 프로세스이다. 이로써, 개발자는 메모리를 따로 관리할 필요가 없다.

✔️ GC가 실행하는 경우

  1. 프로그램의 어느 부분에서도 해당 객체를 참조하지 않는 경우
  2. JVM이 특정 시점에 메모리 부족 상황을 감지한 경우
  3. JVM이 일정 수준 이상의 메모리 리소스를 사용한 경우

✔️ GC의 대상이 되는 경우

  1. 객체의 값이 어디서도 할당되지 않는 경우
    Ex) String name = null;
  2. 블럭 실행 종료 후, 블럭 안에서 생성된 객체

✔️ GC의 실행 순서

1. Marking

⇒ 사용 중인 객체와 사용하지 않는 객체를 구별한다

2. Normal Deletion

⇒ 참조되지 않는 객체를 반환한다.(메모리를 해제한다) 이때, 메모리 Allocator는 반환되어 비어진 블록의 참조 위치를 저장했다가 새로운 객체가 선언되면 할당시킨다. 즉, 더 이상 참조되지 않는 메모리를 식별하여 가비지로 표시하고, 해당 메모리를 해제하여 다시 사용 가능한 상태로 만든다.

Allocator : 메모리를 관리하는 시스템의 한 부분이며, 메모리 할당 및 해제에 대한 책임을 맡고 있다.


3. Compacting

⇒ 참조되지 않는 객체를 제거하고 참조된 객체를 묶는다. 이때, 공간이 생기므로 새로운 메모리가 할당될 때 더 빠르게 진행될 수 있다. 즉, 가비지로 표시된 객체들을 실제로 삭제하고, 남은 객체들을 한 곳으로 모아서 메모리 공간을 연속적으로 배치시킨다.

⚠️정말 개발자가 따로 메모리를 관리할 필요가 없을까???

NO

GC가 인식하지 못하는 메모리가 발생할 수 있고 이떄의 메모리가 축적되었을때 나중에 시스템으로 부하가 발생한다.

만약, Stack에서 사이즈를 16으로 맞추었을 때, 새로운 데이터가 들어와서 데이터를 size*2 만큼 늘리고(즉, 32가 되었을 때) 해당 데이터를 pop()으로 삭제한다면 이전에 늘린 사이즈만큼 메모리를 해제하는 것이 아니다. 이때, 메모리 누수가 발생한다.

이때, 다 사용한 변수에 null값을 할당해서 나중에 gc가 가동되었을 때 수거하도록 하는 것이 좋다.

그럼, 다 쓴 변수에 null값을 계속 할당하는 게 좋은가?

아니다. null로 변경하는 것은 예외적인 경우에만 사용하는 것이 좋으며, 다 쓴 객체 참조를 해제하는 가장 좋은 방법은 해당 객체 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이다.

메소드 안에서 지역변수로 선언했던 객체는 메소드가 종료되었을때 gc가 수거한다. 그럼 매번, 지역변수로 변수를 선언해서 메모리의 누수를 막아야하는가?

아니다. 개발자는 프로그램의 가독성, 유지 보수성, 코드 구조 등을 고려해서 개발해야 한다.


참고 : https://gyoogle.dev/blog/computer-language/Java/Garbage%20Collection.html

profile
BE Developer

0개의 댓글