JVM 구조

백현균·2024년 1월 14일

동작 구조도

  • JVM은 OS로부터 메모리를 할당 받는다.
  • 자바 컴파일러 jvav는 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일
  • ClassLoader는 컴파일된 자바 바이트코드를 Runtime Data Area영역에 로드
  • 로딩된 바이트코드는 Execution Engine을 통해 해석된다.
  • 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되고, 실행되는데, 이 과정에서 Execution Engine에 의해 GC와 쓰레드 동기화가 이뤄짐

ClassLoader

  • 자바는 동적으로 클래스를 읽어 오는데, 자바의 모든 소스코드는 JVM과 연결이 되는데, 이렇게 동적으로 바이트코드를 로딩해주는 역할을 함
  • 자바 컴파일러가 컴파일을 하면 바이트코드(.class)파일이 생성이 되는데, ClassLoader는 바이트 코드 파일을 묶어서 JVM이 운영체제로 부터 할당받은 메모리 영역인 Runtime Data Area에 적재

Exection Engine

  • ClassLoader에 의해 JVM으로 로드된 바이트코드들은 Runetime Data Area의 Method Area영역에 배치가 되는데, 배치된 이후 JVM은 Method Area의 바이트코드를 Exection Engine에 제공하여 정의된 바이트 코드를 실행 시킴

Garbage Collector

  • JVM은 가비지 컬렉터를 이용하여 사용하지 않는 메모리를 자동 회수하며, 개발자는 따로 메모리를 관리하지 않아도 되므로 프로그래밍을 쉽게 할 수 있도록 도와줌
  • Heap영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색하여 제거하는 역할을 하며, 해당 역할을 하는 시간은 정확히 알 수 없으며, GC역할이 수행되는 동안 해당 작업 쓰레드를 제외한 모든 쓰레드들은 일시 정지

Runtime Data Area

  • Runtime Data Area은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

HEAP영역

  • new 키워드로 생성된 객체 및 배열이 생성되는 영역(즉, 포인트형태로 주소레퍼런스를 가지는 데이터의 영역)
  • 주가적으로 GC가 제거하는 영역
  • HEAP 영역은 크게 Young Generation, Tenured Generation, Permanent Generation영역으로 나뉨
  • Young Generation: 자바에서 객체가 생성되자마자 저장되며, HEAP영역에 객체가 생성이되면 최초로 Eden영역에 할당되고, 이 영역에 어느정도 쌓이게 되면 참조정도에 따라 Survivor의 빈 공간에 이동되거나 GC에 의해 해제
  • Tenured Generation(OLD): Young Generation영역에 객체가 쌓일 경우 참조되는 정도에 따라 Old영역으로 이동됨.
  • Young Generation과 Tenured Generation 에서의 GC를 Minor GC라고 불리며, Old영역에 할당된 메모리가 허용치를 넘게되면 Old영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하느 GC가 실행되며 이 때 GC실행 쓰레드 외에 모든 쓰레드는 작업을 일시정지함

STACK영역

  • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

PC 레지스터

  • 쓰레드가 생성될 때마다 생성되는 영역으로 프로그램의 카운터, 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역

Native Method Stack

  • 자바 이외에 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역
  • 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며, 자바 컨파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 것이 자바 인터프리터임

이미지 참조: https://coding-factory.tistory.com/828

0개의 댓글