JVM(Java Virtual Machine)

By | 2020년 3월 27일
Table of Contents

JVM(Java Virtual Machine)

출처 : https://jeong-pro.tistory.com/148

JVM 은 자바 바이트코드를 실행하는 가상 머신입니다.

바이트 코드 상태의 class 파일을 읽어들여, 운영체제가 인식할 수 있는 기계어로 변경하고, 실행하는 역할을 합니다.

JVM 의 구성요소

JVM 은 크게 4가지 구성으로(Class Loader, Execution Engine, Garbage Collector, Runtime Data Area) 나누어 집니다.

Class Loader

자바 컴파일러에 의해 바이트코드로 변환된 클래스를 읽어들여 Runtime Data Area 에 적재하는 역할을 합니다.

Execution Engine

Class Loader 에 의해 Runtime Data Area 에 적재된 클래스(바이트코드) 를 기계어로 변환하고 실행하는 역할을 합니다.

명령어는 Interpreter 방식으로 하나하나 실행되기도 하고, JIT(Just-In-Time) 에 의해 적절한 시간에 전체 바이트코드를 네이티브코드로 변환하여 실행되기도 합니다.

Garbage Collector

Garbage Collector(GC)Heap 영역에 생성되어 있는 객체들 중 참조되지 않는 객체를 찾아 제거하는 역할을 합니다.

GC 가 실행되는 시간은 정해져 있지 않습니다. 특히 Full GC 가 발생하는 경우, GC 를 제외한 모든 스레드가 중지되기 때문에 장애가 발생할 수 있습니다.

Runtime Data Area

JVM 의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.

Runtime Data Area 상세

이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 으로 나눌 수 있습니다.

Method Area

클래스 정보가 저장되는 공간입니다.

클래스의 메소드 정보가 저장되고, 맴버 변수의 이름과 타입, 메소드의 이름과 파라미터 그리고 리턴값이 저장되고, 각종 상수, static 메소드, final 클래스 변수 등이 저장됩니다.

Heap Area

new 키워드에 의해 생성되는 클래스와 배열 등이 저장됩니다.

Method Area 영역에 저장된 클래스만이 생성 가능하고, Garbage Collector 에 의해 사용되지 않는 클래스/배열이 제거됩니다.

Stack Area

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

int 와 같은 클래스 아닌 변수들은 이곳에 저장됩니다. Person p = new Person(); 와 같이 클래스를 생성할 경우, new 에 의해 생성된 클래스는 Heap Area 에 저장되고, Stack Area 에는 생성된 클래스의 참조인 p 만 저장됩니다.

클래스의 메소드를 실행할 때마다 스택이 생성됩니다.

Method Area, Heap Area 를 제외한 영역들은 스레드간에 공유되지 않습니다.

PC Register

스레드가 생성될 때마다 생성되며, 현재 실행중인 주소와 명령을 저장합니다.

멀티 스레드가 동작할 때, 이곳의 정보를 이용해 여러 스레드를 동시에 실행할 수 있습니다.

Native Method Stack

자바 이외의 코드(JNI) 가 저장되는 공간입니다.

Heap area & Garbage Collector

Heap area 의 구성과 Garbage Collector 의 세부적인 실행방식은 변천사가 좀 있지만, 아래에서는 JDK7 버전을 기준으로 설명합니다.

Heap areaeden, survivor1, survivor2, old, permanent 로 5개로 구성됩니다.

Minor GC

  • 최초에 객체는 모두 eden 에 생성됩니다.

  • eden 영역이 가득차게 되면 첫번째 GC(Minor GC) 가 발생합니다. survivor1 영역으로 eden 영역의 메모리를 그대로 복사합니다. 그리고, survivor1 영역을 제외한 다른 영역의 객체를 제거합니다.

  • eden 영역과 survivor1 영역이 모두 가득차게되면, 참조되고 있는 객체를 찾아 모두 survivor2 로 복사합니다. survivor2 를 제외한 나머지 영역의 객체를 모두 제거합니다.

  • 위 과정을 반복하고, survivor2 가 가득차기 전에 old 영역으로 다시 복사를 진행합니다.

Major GC(Full GC)

old 영역을 검사하여 참조가 없는 객체들을 찾아 모두 제거합니다.

이렇게 하면 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간) 이 생기는데, 이것을 디스크 조각모음처럼 조각난 메모리를 정리합니다.

모든 메모리를 이동시키기에 다른 스레드가 접근할 수 없도록 모든 스레드를 정지시킵니다.

메모리 관련 중요 파라미터

답글 남기기