본문 바로가기

프로그래밍/JAVA

[JAVA] JVM 구조와 동작 2 (Runtime Data Area, Garbage Collector)

반응형

Runtime Data Area

JVM의 메모리 영역으로 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack

5개의 영역으로 나뉜다.

 

Method Area

클래스의 이름, 타입, 멤버변수, 접근제어자, 메소드 이름, 파라미터 타입, 리턴타입 등 클래스 레벨의 정보들이 저장된다.

이 영역에는 Runtime Constant Pool이라는 별도의 관리 영역이 존재하는데, 이 공간은 상수 자료형을 저장해 참조하고 중복을 막는 역할을 한다.

-> 모든 Thread가 공유하는 영역

 

Stack Area

런타임 중 Method 호출시 각 생성되어 사용되는 영역, 지역변수, 파라미터, 리턴값 등의 정보가 저장된다.

Method 종료시 해당 Stack은 소멸된다.

-> 각 Thread가 공유하지않는 영역

 

PC Register

각 Thread 생성 시 생성되는 영역

각 Thread가 다음 실행할 명령어의 주소를 저장하고 있으며, Context Swithing이 일어날때 참조하여 다음 명령어를 실행

-> 각 Thread가 공유하지않는 영역

 

Native Method Stack

Java 외 언어인 C/C++ 등의 네이티브 언어를 실행하기 위한 스택영역

 

Heap Area

 생성된 객체나 배열이 저장되는 영역

User user = new User();

여기서 user는 객체의 메모리 주소를 참조하는 변수로 Stack 영역에 저장되고,

실제 객체는 Heap 영역에 저장됨

주기적으로 참조되지않는 객체는 Garbage Collector에 의해 메모리가 해제됨

-> 모든 Thread가 공유하는 영역

 

Garbage Collector

주기적으로 Heap 영역의 참조되지않는 객체들의 메모리를 해제 해준다.]

언제 실행되는지는 알 수 없다.

 

Heap 메모리는 크게 Young Generation, Old Generation으로 나뉘는데,

Young Generation(Eden, survivor) 에는 새로 생성된 객체가 저장되어진다.

Old Generation에는 오래 사용되는 객체가 저장되어진다.

 

동작

 - Minor GC

 1. 새로 생성된 객체들은 Eden 영역에 할당된다.

 2. Eden 영역이 꽉 차면 참조 되지 않는 객체는 메모리를 해제하고 참조되는 객체들은

    하나의 survivor 영역에 복사한 후 Eden 영역을 비운다.

 3. 다시 Minor GC가 발생할 때, 위의 1~2번을 수행하면서

    현재 메모리가 할당되어 있는 survivor영역을 비우고 참조되고 있는 객체를

    다른 survivor 영역으로 옮겨진다.

    이때 객체의 헤더에 Age의 값이 증가하게 된다.

 4. 1~3번을 반복적으로 수행하다가 Young generation 영역에서 특정 Age값 이상이 되는 객체들은

    Old Generation으로 옮기게 됨 -> Promotion

 5. Promotion이 반복되고 Old 영역이 꽉 차면 Major GC가 발생

 

 - Major GC 

 Old 영역이 꽉 차면 Old 영역의 참조 되지않는 객체들을 정리한다.

 Old 영역은 Young 영역보다 대체로 크기 때문에 실행속도가 더 느리다.

 

 - Full GC 

 Minor GC + Major GC를 모두 수행한다. 즉 모든 Heap 영역

 수행속도가 매우느리다.

 GC를 수행할때, 모든 Thread는 멈추게 되므로 Full GC의 횟수를 줄이는 것이 좋다.

반응형