Garbage에 관하여

2020-03-21

이번 포스팅에서는 자바의 Garbage에 대한 간단한 정리입니다.


Garbage 란 ?

가비지는 ‘정리되지 않은 메모리’, ‘유효하지 않은 메모리 주소’를 뜻한다.

Garbage Collector

자바 실행 프로그램 JVM 과 메모리

메모리는 OS가 관리하는데 모든 프로그램들은 OS 위에서 돌아간다.

그래서 프로그램들은 OS에게 메모리 할당을 요청하는데 자바 실행 프로그램인 JVM 도 예외가 아니다.

JVM이 메모리가 필요하면 OS에게 요청한다.

OS가 처음부터 자기가 가진 메모리를 전부 빌려주면 다른 프로그램들에게

줄 메모리가 없게 되기 때문에 각 프로그램에게 메모리의 일부분만 빌려주는 방식으로 관리가 된다.

JVM 은 OS로 받은 메모리 중에서 어디에 데이터를 저장할지 주소를 할당해야 한다.

JVM은 자기가 받은 메모리 안에서 절대주소가 아니라 ‘상대주소’를 할당한다.

이것을 offset 주소라 한다.

프로그램이 OS로부터 부여받은 메모리는 물리적으로 분리되어 있을 수 있지만 논리적으로는 하나의 메모리처럼 동작한다.

Garabage Collector 란 ?

메모리가 부족할 때 가비지를 자동으로 정리해주는 프로그램을 말한다.

프로그램을 실행하다 보면 가비지가 발생하는데 이것은 유효한 메모리가 아니다.

정리되지 않은 채로 남아있는 메모리들은 사용되지도 않는데 자리만 차지하고 있게 된다.

그래서 JVM의 가비지 컬렉터는 사용되고 있지 않은 메모리를 다른 용도로 사용할 수 있게 ‘메모리 해제’를 시켜는 프로그램이다.

Garbage Collector 대상이 되는 객체

모든 객체의 참조가 모두 null일 경우 GC 대상이 됩니다.

하지만 원형참조(A가 B를 B가 A를 참조하는 형태)인 경우에는 참조로 간주하지 않습니다.

객체 A, B에 다른 살아있는 객체의 참조가 없다면 또한 GC의 대상입니다.

일반적으로 다음과 같은 경우에 GC의 대상이됩니다.

  1. 모든 객체 참조가 null 인 경우

  2. 객체가 블럭 안에서 생성되고 블럭이 종료된 경우

  3. 부모 객체가 null이 된 경우, 자식 객체는 자동적으로 GC 대상이 된다.

  4. 객체가 Weak 참조만 가지고 있을 경우

  5. 객체가 Soft 참조이지만 메모리 부족이 발생한 경우

Garbage Collector 은 언제 실행 되나?

  • JVM은 메모리를 부여받고 열심히 프로그램을 실행하다가 메모리가 부족해지는 순간이 오면 OS에게 추가로 메모리를 요청한다.

바로 이 때 메모리를 더 달라고 요청하는 순간에 가비지 콜렉터가 실행된다.

또한, 서버 프로그램인 경우에는 24시간 내내 돌아가는데 이 때에는 JVM이 한가할 때(idle time) 가비지 컬렉터가 실행된다.

JVM이 종료되면 당연히 사용하던 모든 메모리는 OS에게 반납된다.

아래는 참고로 보면 좋을 것 같은 블로그 링크를 올린다.

참고자료 : https://12bme.tistory.com/57