[CS] 가비지 컬렉션

말하는 감자·2025년 1월 10일

CS

목록 보기
9/33

가비지 컬렉션이란

  • 참조되지 않는 객체들이 차지하고 있는 메모리를 해제하는 것

  • 더이상 참조되지 않고있는 객체들이 차지하고 있는 메모리의 낭비들을 C,C++에서는 직접 해제해서 해결해줘야 했지만, Java는 JVM의 가비지 컬렉터가 자동으로 수행해줌

  • 가비지 컬렉터는 런타임 영역의 Heap 영역(객체의 인스턴스가 저장되는 공간)을 관리함

Heap 영역 내부에서 발생하는 가비지 컬렉션


1. 메모리에 객체가 생성되면 힙 영역 내부의 Eden 영역에 위치한다.
2. 객체가 계속 생성되고 Eden 영역이 다 차면, GC를 실행

GC 과정


1 . Mark: 살아 있는 객체를 마킹

2. Sweep: 참조하지 않는(마킹x) 쓰레기 객체들을 Heap에서 제거

3. Compact: 살아남은 객체들은 한 곳으로 모은다.

4. 살아 남은 객체는 survivor 영역으로 이동
5. 살아남은 객체의 age가 1 증가

  • jsk의 경우 31까지 age가 증가하면 Old Generation으로 이동(그 다음은 모름)
    위 과정을 계속해서 반복

GC 발생 빈도를 줄여 성능 개선

  • GC는 작동 시, STW(Stop the World)라 하여 GC가 작동하는 동안 모든 애플리케이션 스레드가 중단되어 이는 응답시간을 상승시키는 부작용을 유발한다.

개선 방법

  1. 잦은 문자열 결합에는 String 대신 StringBuilder
    • 문자열을 결합할때마다 새로운 메모리공간을 차지하는 String과 달리 StringBuilder는 최초 생성한 주소에 문자를 덧붙이는 방식이라 인스턴스를 하나밖에 차지하지 않아서 GC를 발동 할 필요가 x
  2. Wrapper 클래스보다는 기본 타입 사용
    • Wrapper 클래스는 객체를 생성할때마다 새로운 인스턴스가 생성된다
    • long 이 아닌 Long을 사용하면 반복문을 돌때마다(Integer->21억개) 불필요한 인스턴스를 생성함

JVM에서는 객체 생성, 회수가 크게 부담이 되는 일은 아니기에 프로그램 기능을 위해 객체 추가 생성은 좋은 일이지만, 불필요하게 메모리를 사용하는 상황은 GC를 더 빈번하게 발생시켜 응답시간을 늦춰 성능에 영향을 준다는 것을 고려

static

  • static 변수는 클래스가 메모리에 로드될 때 초기화되며, 프로그램이 종료될 때까지 메모리에 유지된다.
  • 하지만, static 변수 또한 heap 영역에 저장되기 때문에 가비지 컬렉션의 관리 대상이다.
  • 즉 안쓰면 가차없이 스태틱변수라고 한들 지워짐
profile
주니어개발자(?)

0개의 댓글