Sad Puppy 3 GC :: 개발자 아지트

GC;Garbage Collection 이란?

자바의 메모리 관리 방법 중의 하나

 

JVM Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스

 

*JVM 메모리 영역에서 Heap 영역은 객체가 생성되어 저장되는 공간이다.

(new 키워드로 생성된 객체들이 저장됨)

 

- 다른 영역

    - Method 영역

       

        클래스 정보 저장공간

       

    - Stack 영역

       

        메서드 실행 시 사용되는 공간(지역변수, 호출정보 등)

[장점]

 

Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있음

 

→ 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에 대해 관리하지 않아도 되어 오로지 개발에만 집장할 수 있음

 

*C/C++에서는 이런게 없어서 개발자가 수동으로 메모리 할당과 해제를 해줘야 했었음

 

*파이썬, 자바스크립트, Go 등에도 가비지 컬렉션이 기본 내장 되어있음

 

→ 가비지 컬렉션에 대해 제대로 학습하면, 자바 외의 다른 언어의 가비지 컬렉션 동작에 대해서도 어느정도 통달

 

[단점]

 

자동으로 처리해준다 해도 메모리가 언제 해제되는지 정확하게 알 수 없어서 제어하기 힘듦

 

가비지 컬렉션이 동작하는 동안, 다른 동작을 멈추기 때문에 오버헤드가 발생됨

 

*오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간이나 메모리 등

 

⇒ 이를 Stop-The-World 라고 함

 

STW;Stop-The-World

GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상

GC가 동작하는 동안 GC관련 Thread를 제외한 모든 Thread는 멈추게 되어 서비스 이용에 차질이 생길 수 있음이 시간을 최소화 시키는게 중요함

⇒ 따라서 GC가 너무 자주 실행되는것도 소프트웨어 성능 하락을 초래할 수 있음

 

ex) exploler GC를 너무 자주 실행시켜 성능에 문제를 일으키는 것으로 악명 높았음

 

⇒ 실시간 동작이 중요한 프로그램은 GC사용이 부적절 할 수 있음

 

따라서 개발자가 애플리케이션 사용성을 유지하며 효율적으로 GC를 실행하는 최적화 작업을 해줘야함

 

⇒ 이를 GC 튜닝이라 한다.

 

GC는 어떻게 힙 영역을 관리하나요?

 

모든 객체는 처음에 Young Generation에 생성된다.

 

*Young Generation의 공간은 Old Generation에 비해 상대적으로 좁기 때문에 빠르게 메모리 상의 객체를 찾고 제거할 수 있다. (Young Generation에서 발생되는 GC Minor GC라고 한다)

 

1-1. 정확히는 Young Generation에서 Eden 영역에 위치하게 된다.

 

1-2. 객체가 계속 생성되어 Eden 영역이 꽉 차게 되면 Minor GC가 실행된다.

 

1-2-1. Mark 동작을 통해 reachable 객체를 탐색한다.

 

1-2-2. Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동한다.

 

1-2-3. Eden 영역에서 사용되지 않는 객체(unreachable)의 메모리를 해제(sweep)한다.

 

1-3. 살아남은 모든 객체들의 age(Survivor 영역에서 살아남은 횟수)값이 1씩 증가한다.

 

*만약 age값이 임계값에 다다르면 Promotion(Old 영역으로 이동) 여부를 결정한다.

 

1-1, 1-2, 1-3 과정이 반복됨.

 

Old Generation은 길게 살아남(age 임계값 도달)은 메모리들이 존재하는 공간이다.

 

객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 Major GC(Full GC)가 발생한다.

 

Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제함

 

⇒ 하지만 공간이 Young Generation에 비해 크기 때문에 메모리 상의 객체 제거에 많은 시간이 걸림

 

*Young Generation에서는 GC 0.5-1초 사이에 끝나서 애플리케이션에 크게 영향을 안주지만,

Old Generation에서는 Young Generation GC에 비해 10배 이상의 시간을 사용함

 

⇒ 이때 STW 문제가 발생하게된다!!

 

Major GC가 일어나면 Thread가 멈추고 Mark and Sweep 작업을 하느라 CPU에 부하를 주기 때문에 멈추거나 버벅이는 현상이 일어난다.

+ Recent posts