본문 바로가기
  • soobinhand의 기술 블로그
도서/자바 프로그래밍 언어 - James Gosling

[자바 프로그래밍 언어] 17장 가비지 컬렉션과 메모리

by soobinhand 2022. 1. 6.
728x90

17.1     가비지 컬렉션

  • 자바 가상 머신은 가비지 컬렉션을 통해 프로그램에서 더 이상 참조되지 않는 객체를 찾아서 메모리 공간에서 제거한다.
  • 자바에는 객체를 생성하기 위한 new 연산은 있지만 생성된 객체를 메모리에서 제거하는 delete 연산은 없다. 그래서 객체의 사용이 끝났을 때, 우리가 할 수 있는 일은 사용이 끝난 객체의 참조를 끊는 것 뿐이다. 참조를 끊기 위해서는 사용하고 있던 참조를 다른 객체의 참조로 변경하거나 null을 설정 또는 메소드를 반환해서 이 메소드의 지역 변수가 더 이상 존재하지 않게 하여 메소드 내의 변수들이 어떤 것도 참조할 수 없게 해야 한다. 이렇게 참조가 끊긴 객체를 가비지라고 하며 이러한 가비지들을 찾아서 메모리에서 제거하는 것을 가비지 컬렉션이라고 한다.
  • 자바 가상 머신은 가비지 컬렉션을 사용하여 참조되고 있는 객체는 메모리에서 유지하고 더 이상 참조되지 않는 객체는 메모리에서 제거한다.
  • 가비지 컬렉터는 메모리 공간이 더 필요하거나 메모리 부족현상이 발생할 가능성이 있을 때, 가비지들을 수집하고 이 가비지들의 메모리 영역을 회수한다. 하지만 메모리 공간에 여유가 많을 때는 가비지 컬렉션이 수행되지 않을 수 있다.
  • 어떤 객체 참조가 현재 실행 중인 메소드의 어떤 변수에도 존재하지 않거나, 이 변수들이 참조하고 있는 객체의 필드나 배열 요소 등에서도 이 객체를 참조하고 있지 않다면 이 객체는 "더 이상 참조 가능하지 않다" 라고 말할 수 있다.
  • 가비지 컬렉션은 다른 곳에서 참조되는 객체는 가비지 컬렉션의 대상이 되지 않게 해주며 메모리 공간이 비어있다고 오판하는 경우도 절대 생기지 않게 한다.
  • 어쨌든 설계를 잘해서 수집할 가비지의 양이 많지 않게 해야 한다.

17.2     단순한 모델

  • 가비지 컬렉션의 가장 단순한 모델은 표시 및 수거이다.

17.3     객체 마무리

  • 일반적으로 사용되지 않는 객체가 메모리 공간에서 회수되는 시점은 알 수 없다. 하지만 클래스에 finalize 메소드를 구현하면 회수 시점을 알 수 있다. 이 메소드는 해당 클래스 객체가 메모리 공간에서 회수되기 전에 시스템에 의해 호출된다. 이렇게 finalize 메소드가 호출되어 특정 작업을 수행하는 것을 객체의 마무리 작업이라고 한다.
  • 더 이상 참조할 수 없는 객체의 메모리 공간을 회수할 때 가비지 컬렉터는 finalize 메소드를 호출한다.
  • 가비지 컬렉션은 메모리만 수집한다. 그래서 가비지 컬렉션이 회수하지 않는 비메모리 자원을 다뤄야 하는 경우에 finalize 메소드가 좋은 방법이라고 생각할 수 있을 것이다.
  • 외부 자원을 할당하는 객체에는 finalize 메소드를 작성하여 외부 자원을 정리해야 한다. 그래야 자원 누수 현상이 발생하지 않는다.
  • finalize 메소드에서 항상 super.finalize를 호출할 수 있도록 습관화해야 한다.
  • 자신의 클래스가 다른 클래스를 확장하지 않더라도 super.finalize 메소드를 호출하는 것은 좋은 습관이다.
  • 애플리케이션이 종료되면 가비지 컬렉션은 더 이상 수행되지 않는다. 그래서 아직 회수되지 않은 객체들의 finalize 메소드는 호출되지 않는다. 대부분의 경우에 이는 문제의 소지가 있다.
  • finalize 메소드는 객체를 static 리스트에 추가하여 객체를 소생시킬 수 있다. 객체 소생은 장려되지 않지만 시스템으로는 이를 막을 수 없다.
  • 객체 소생이 설계의 중요한 부분이더라도 객체는 오직 한 번만 소생될 수 있음에 주의해야 한다.

17.4     가비지 컬렉터와의 상호 작용

  • 객체를 생성하기 전에 gc를 호출하는 것은 권장할 만하다. 특히 가비지 컬렉션이 부하를 발생시킬 수도 있는, 시간에 민감한 애플리케이션에서는 더 권장할만 한다.

17.5     참조 가능성 상태와 참조 객체

  • 객체는 자기 객체를 가리키는 참조가 없을 때만 가비지 컬렉션의 대상이 될 수 있다.
  • 참조 객체는 다른 객체의 참조를 유지하는 역할만을 수행하는 객체이다. 여기서 다른 객체의 참조를 레퍼런트라고 한다.
  • 사용할 수 있는 참조 객체들을 강도 세기에 따라 나열하면 SoftReference<T>, WeakReference<T>, PhantomReference<T>이다.
  • soft 참조는 새로 생성되거나 사용된 참조가 아닌 오래된 참조를 제거하는 일종의 캐시기능을 제공한다.
  • weak 참조는 객체 참조를 유지하는 방법으로써 "객체를 참조하는 유일한 참조가 weak 참조라면 이 객체를 회수하라" 라는 의미를 갖는다.
  • 객체의 참조 가능성 상태가 변경되면 객체 참조는 참조 큐에 저장될 수 있다. 이 큐를 통해서 가비지 컬렉터는 참조 가능성을 변경하는 코드와 서로 정보를 주고받을 수 있다.
728x90

댓글