반응형

먼저 보면 좋을 JVM의 구성 및 동작 원리

JVM(자바 가상 머신)의 내부 구성 및 동작 원리

 

JVM(자바 가상 머신)의 내부 구성 및 동작 원리

JVM(Java Virtual Machine)의 동작 방식 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일. Class Loader가..

soopeach.tistory.com


가비지 컬렉션(Garbage Collection)

가비지 컬렉션(Garbage Collection)은 자바의 메모리 관리법 중 하나인데 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역중 필요없게된 메모리를 주기적으로 삭제하는 프로세스임. 가비지 컬렉션은 줄여서 GC라고도 불림.

 

C/C++에서는 가비지 컬렉터가 없어 프로그래머가 수동으로 메모리를 할당, 해제 하여 관리해야했음.

JVM기반의 JAVA, Kotlin은 가비지 컬렉터가 메모리 관리를 대신해주기 때문에 프로그래머가 메모리 관리, 누수에 대하여 신경쓰지 않고 오롯이 개발에만 집중할 수 있음.


가비지 컬렉션의 단점

가비지 컬렉션은 메모리 관리측면에 있어 굉장히 유용하지만 단점도 존재.
아래의 두 가지 단점이 대표적인 단점.

  1. 메모리가 언제 해제되는지 정확한 시점을 알 수 없음.
  2. 가비지 컬렉션이 동작하는 동안에는 다른 동작들이 멈추기 때문에 오버헤드가 발생함.("Stop-the-World")

2번 단점때문에 GC가 너무 자주 동작하면 소프트웨어 성능 하락의 문제가 될 수 있음.
이러한 특성이 있는 GC는 실시간으로 계속 동작해주어야 하는(잠시라도 멈추면 안되는) 시스템들에는 GC의 사용이 적합하지 않음.


가비지 컬렉션의 대상이 되는 객체들

실제 객체들은 Heap 영역에서 생성되고 Method Area, Stack Area등 Root Area에서는 Heap Area에 존재하는 객체의 주소만 참조하는 형식으로 구성됨. 하지만 Heap Area에 생성된 객체들이 메서드가 끝나는 등의 특정 이벤트로 인하여 해당 객체의 메모리 주소를 가지고 있는 참조 변수가 사라진다면 위의 그림에서 빨간색으로 표시된 객체와 같이 어디에서도 참조되어지지 않는 객체가 생기게 됨.
이러한 객체를 "Unreachable"하다고 하며 이러한 객체들을 GC가 제거해줌.(참조되고 있다면 "Reachable"

 

Reachable : 객체가 참조되고 있는 상태
Unreachable : 객체가 참조되고 있지 않는 상태

Mark And Swap 알고리즘

가비지 컬렉션은 더 효율적으로 동작하기 위하여 Mark And Swap 알고리즘으로 동작함.

루트에서 해당 객체에 접근이 가능한지에 대한 여부를 메모리 해제의 기준으로 잡음.

 

  • Mark 과정 : Root에서 시작하여 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체들을 참조하고 있는지 찾아서 마킹
  • Sweep 과정 : 참조하고 있지 않은 객체 , Unreachable 객체들을 Heap에서 제거
  • Compact 과정 : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축
    (이 과정은 GC의 종류에 따라 하지 않는 경우도 있음.)

GC의 대상이 되는 Heap의 영역

효율적인 GC를 위하여 Heap Area는 위와 같이 Young generation(Eden+Survival)과 Old generation으로 나누어짐

 


GC의 동작 과정

첫 번째 과정

객체가 처음 생성되면 Heap 영역의 Eden 영역에 age-bit 0으로 할당됨.
age-bit는 Minor GC에서 살아남을 때마다 1씩 증가!

 

두 번째 과정

시간이 지나 Heap 영역의 Eden 영역에 객체가 다 쌓이게 되면 Minor GC가 동작하게 됨.
참조 정도에 따라 Survival 0 영역으로 이동되거나 회수됨.

 

세 번째 과정

계속해서 Eden 영역에는 신규 객체들이 생성됨.
이렇게 Eden 영역에 지속적으로 신규 객체가 생기게 되면 Eden 영역에 객체가 다 쌓이게 됨.
Eden 영역에 객체가 다 쌓이게 되면 Young Generation(Eden+Survival) 영역에 있는 객체들을 참조 정도에 따라 비어있는 Survival인 Survival 1 영역으로 이동 혹은 회수. 살아남아 Survival 1로 이동한 객체들은 age-bit가 1 증가.

 

네 번째 과정

또 다시 Eden 영역에 신규 객체들로 가득 차게되면 다시 한 번 Minor GC가 동작.
이번에는 Young Generation에 있는 객체들을 비어있는 Survival인 Survival 0으로 이동시킨 뒤 age 1증가.

이러한 과정을 반복!

 

다섯 번째 과정

위의 과정들이 반복되면 age-bit가 특정 숫자(JVM에서 설정해 놓은 age-bit) 이상으로 되는 경우가 발생. 
이때 JVM에서 설정해놓은 age-bit에 도달하게 되면 해당 객체는 오랫동안 쓰일 객체라고 판단하여 Old Generation 영역으로 이동.

해당 과정은 프로모션("Promotion")이라고 불림.

 

마지막 과정

시간이 지나 Old 영역에 할당된 메모리가 허용치를 넘게되면, Old 영역에 있는 모든 객체들을 검사하여 참조되고 있지 않은 객체들을 한꺼번에 삭제하는 GC가 동작.

이렇게 Old Generation영역의 메모리를 회수하는 GC가 Major GC임.

Major GC는 시간이 오래 걸리는 작업이며, 이때 GC를 실행하는 스레드를 제외한 모든 스레드는 작업을 멈추게 됨.
이러한 상태를 "Stop-the-World"라고 함.


가비지 컬렉터의 전체적인 라이프 사이클


참고

https://coding-factory.tistory.com/829

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기