가비지 컬렉션(Garbage Collection)이란?

dongeranguk·2021년 12월 6일
1
post-custom-banner

가비지 컬렉션이란

직역하자면, 쓰레기 수집으로 메모리 관리 기법중 하나로, 동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다. 여기서 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미한다.


장점

가비지 컬렉션이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다. 가비지 컬렉션은 다음과 같은 버그를 줄이거나, 완전히 막을 수 있다.

  • 유효하지 않은 포인터 접근 : 이미 해제된 메모리에 접근하는 버그

  • 이중 해제 : 이미 해체된 메모리를 또다시 해체하는 버그

  • 메모리 누수 : 더 이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그


단점

반면, 가비지 컬렉션은 다음과 같은 단점을 가지고 있다.

  • 어떤 메모리를 해제할지 결정하는 데 비용이 든다. 객체가 필요 없어지는 시점을 프로그래머가 미리 알고 있는 경우에도 쓰레기 수집 알고리즘이 메모리 해제 시점을 추적해야 하므로, 이 작업은 오버헤드가 된다.

  • 쓰레기 수집이 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다. 때문에, 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다. 이러한 특성은 특히 실시간 시스템에 적합하지 않다.

  • 할당된 메모리가 해제되는 시점을 알 수 없다.


예제

1.

먼저, User라는 클래스를 생성해서 String 타입의 name을 담아주기 위해 변수를 선언했고, getter, setter 메서드를 만들었다.

2.

실행을 위해 main() 메서드를 호출했고, User 객체를 생성했다.
setName() 메서드에 "dongeranguk" 을 지정했고, 잘 지정되어 있는지, System.out.println("user.getName()") 로 확인했다.

그런 뒤에, user에 null을 지정하였고, 다시 user.getName() 메서드를 호출해보니 NullPointerException이 발생했다.

가비지 컬렉션이 메모리 영역을 해제했기 때문에 발생한 것이다.

출처 : 위키백과 https://ko.wikipedia.org/wiki/%EC%93%B0%EB%A0%88%EA%B8%B0_%EC%88%98%EC%A7%91_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

post-custom-banner

0개의 댓글