JVM과 Garbage Collection

JVM 이란?

자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다. JVM의 주요 기능으로는 아래와 같다. 

- JAVA 프로그램이 어느 기기, 또는 어느 운영체제 상에서도 실행될 수 있게 한다.

- 프로그램 메모리를 관리하고 최적화한다.

 

 

 

JVM 메모리 영역

JVM의 메모리 영역은 Class Area, Heap Area, Stack Area, PC Register, Native Method Stack 로 나눌수 있다.

 

 

 

1. Class Area

클래스가 로딩되면, JVM은 해당 클래스 파일을 읽어서 분석하여 클래스 정보, 변수 정보(데이터타입, 접근제어자정보), 메소드 정보, 스태틱 변수 등을 저장한다.

 

 

2. Heap Area

new 키워드로 생성된 객체와 배열이 저장되는 영역이며, Class Area에 로드된 클래스만 생성이 가능하다.

또한, Garbage Collection의 주요 대상이 되는 영역이다.

 

 

3. Stack Area

메소드를 호출할 때마다 개별적으로 스택이 생성되며, 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시값등이 생성되는 영역이다. 메소드 수행이 끝나면 삭제된다. 

 

 

4. PC Register

스레드가 생성될때마다 생성되며, 스레드마다 하나씩 존재한다. 현재 스레드가 실행되는 부분의 주소와 명령을 저장하는 영역이다.

 

 

5. Native Method Stack

자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이며, 일반적인 메소드를 실행하는 경우 JVM 스택에 쌓이다가 해당 메소드 내부에 네이티브 방식을 사용하는 메소드가 있다면 해당 메소드는 네이티브 스택에 쌓입니다.

 

 

 

 

Garbage Collection 이란? 

동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이며, 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미한다. JAVA에서는 JVM에서 Garbage Collection 기능을 자동적으로 수행한다. 

 

 

Garbage Collector 동작 원리

Garbage Collector는 항상 백그라운드에서 데몬 스레드로 돌아가면서 접근 불가능한(Unreachable) 상태가 된 객체들의 메모리를 정리해준다. 크게 Young Generation  Old Generation에서의 동작으로 나누어진다. 

 

 

 

 

1) Young generation

Young generation은 Eden, Survival0, Survival1로 나눠져있다. Eden은 객체가 최초로 Heap에 할당되는 장소이며, 만일 Eden이 가득 찼다면 객체의 참조 여부를 파악하고 참조하는 객체는 Survival로 이동된다. 그리고 참조되는 객체가 모두 이동 되었다면, Eden에서 G.C가 실행된다. 이러한 과정을 Minor G.C라고 한다.

 

 

2) Old generation

Old generation은 새롭게 Heap에 할당된 객체가 존재하는게 아닌 Survival에 오랫동안 참조되었고 사용될 확률이 높은 객체들을 저장하는 영역이다. 이러한 과정 중 메모리가 충분하지 않으면 해당 영역에서 G.C가 발생하는데 이름 Major G.C 라고한다. Major G.C는 Old generation에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한번에 삭제한다. 

이때 G.C를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업이 중지된다. (stop-the-world)

 

 

 

 

참고

https://velog.io/@jsj3282/JVM%EA%B3%BC-%EC%9E%90%EB%B0%94-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0Runtime-Data-Area

https://steady-coding.tistory.com/305

https://www.holaxprogramming.com/2013/07/16/java-jvm-runtime-data-area/

https://bscnote.tistory.com/96

https://hyungjoon6876.github.io/jlog/2018/07/07/how-jvm-works.html

Tags

Read Next