JVM 퀵 리뷰

많은 프로그램의 기초가 되는 JVM과 GC를 퀵 리뷰 해보자.

JVM


JVM은 다음과 같이 시스템 메모리를 관리하면서 자바 기반 어플리케이션을 위해 이식 가능한 실행 환경을 제공한다 JVM은 Java Application이 OS에 구애 받지않고 구동되게 해주며 프로그램 메모리를 관리하고 최적화 해준다. JVM에서 프로그램이 실행되면 다음과 같은 과정을 거친다.

  1. 프로그램이 실행되면 JVM이 OS로부터 메모리를 할당받는다.
  2. 자바 컴파일러가 소스코드를 읽고 자바 바이트코드 (.class)로 바꿔준다.
  3. class파일들을 JVM내 클래스로더가 메모리영역으로 로딩한다.
  4. 로딩된 클래스 파일들은 Execution Engine을 통해 구동. 이 실행과정 속 필요시 GC같은 작업이 이루어짐.

Runtime Data Area는 다음과 같이 나누어져있다.

  • PC 레지스터:
  • 스택: 지역변수, 매서드 데이터 등
  • 힙: 동적으로 할당 되는 데이터
  • Native Method Stack: 실제 실행할 수 있는 기계어로 작성된 프로그램 실행 영역
  • Method: 런타임 상수풀, 정적변수

힙과 매서드는 모든 스레드가 공유

Garbage Collection

GC는 힙 메모리를 다룸. GC는 객체가 NULL이거나, 블럭 실행 종료후 안에 생성된 객체나, 부모가 NULL인데 존재는 자식이 있거나 하는 애들을 대상으로 한다. 크게 객체는 Young 영역과 Old영역으로 나눌 수 있다. 새롭게 생성한 객체는 Young에 들어가며 이 영역에서 일어나는 GC는 Minor GC이다. Old는 Young에서 살아남는 친구들이 가며, GC가 덜 발생한다. 여기서 발생하는 GC는 Full GC이다. Young의 영역은 Eden과 2개의 서바이버 영역이 있는데, 처음 생성되면 Eden에 있다가, GC가 한번 일어났을때 살아남으면 Survivor중 하나로 이동되고, 서바이버 영역 하나가 가득차면 살아남은 객체는 다른 서바이버 영역으로 가게 된다. 그리고 가득찬 영역은 다시 비운다. 그 과정을 거쳐 살아남으면 Old로 가게 된다. Old는 가득차면 GC가 일어나게 되는데, Major GC는 기본적으로 오래걸린다. GC는 기본적으로 시행이 되면 Stop the World되어 애플리케이션 실행을 멈추고, Mark and Sweep하여 사용하지 않는 메모리를 찾아 해당 객체들을 메모리에서 해제하여 준다.

Reference

https://mangkyu.tistory.com/118
https://d2.naver.com/helloworld/1329
https://gyoogle.dev/blog/computer-language/Java/Java%20Virtual%20Machine.html