JVM이란 Java Virtual Machine의 줄임말로 자바를 실행하기 위한 가상의 기계라고 할 수 있다.
Java는 OS에 종속적이지 않다는 특징을 가지고 있는데 OS에 종속받지 않고 실행하기 위해
필요한 것이 바로 JVM이다.
Java 소스코드(원시 코드)는 컴퓨터가 인식하지 못하기 때문에 컴퓨터가 인식할 수 있도록
해주는 컴파일이라는 과정이 필요하다. 자바 컴파일러가. java 파일을 JVM이 인식할 수 있는
. class 파일로 변환하여 주고 JVM을 거쳐 OS로 도달한다.
더 이상 필요 없어진 메모리를 쓰레기(Garbage)라고 하고 이를 효과적으로 처리하는 작업을
Garbage Collection(GC)라고 한다. GC작업을 하는 가비지 콜렉터는 1) 메모리를 할당하고,
2) 사용 중인 메모리를 인식하며, 3) 사용하지 않는 메모리를 인식한다.
즉, 메모리가 부족해 쓰레기를 정리해주는 프로그램을 가비지 컬렉터라고 부른다.
메모리의 영역중 Stack은 정적으로 할당한 메모리 영역으로 원시 타입의 데이터가
값과 함께 할당되고, Heap영역에 생성된 Object 타입의 데이터의 참조 값이 할당된다.
Heap은 동적으로 할당한 메모리 영역으로 모든 Object 타입의 데이터가 할당되고
Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당된다.
가비지 컬렉터의 과정은 Stack의 변수를 찾아서 스캔하면서 각각 어떤 객체를 참조하고 있는지
찾아서 마킹하고 Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.
그 후 마킹되지 않은 객체를 Heap에서 제거한다. 이러한 과정을 Mark and Sweep이라고 한다.
Heap영역은 Young, Old generation으로 나눌 수 있는데 Young generation은
Eden, Survival 0, Survival 1로 구분할 수 있다. 새로운 객체는 Eden 영역에 할당되며
이 메모리가 가득차면 Minor GC가 발생된다. Mark and sweep 이후 살아남은 객체들은
S0 영역으로 옮겨진다. 이 과정이 반복되어 S0영역이 가득 차게 되면 S0에서
Mark and sweep이 진행되고 살아남은 객체들은 age값이 증가되어 S1으로 옮겨진다.
이후 발생되는 Eden영역의 Reachable 객체는 Survial 1으로 옮겨지는데
Survival 영역 중 한 곳은 비워두기 위함이다. S1의 영역이 가득 차게 되면
이번에는 age값이 증가하여 S0영역으로 옮겨진다.
이 과정이 반복되며 특정 age값을 넘어서면 Old generation으로 이동되고
이 과정을 Promotion이라고 한다.
Promotion이 진행되어 Old generation이 가득 차면 Major GC가 발생된다.
참조)
https://www.youtube.com/watch?v=vZRmCbl871I
'Study' 카테고리의 다른 글
| 애자일 소프트웨어 개발(Agile Software Development) (0) | 2022.07.09 |
|---|---|
| 시스템 설계와 프로그램 구현 (0) | 2022.07.08 |
| MVC 패턴(2) (0) | 2022.07.07 |
| 알고리즘과 시간복잡도(Time Complexity) (0) | 2022.06.12 |
| 빌드(Build)란 무엇인가 (0) | 2022.06.12 |