JVM(Java Virtual Machine)

jungwoo jo·2021년 8월 17일
0
post-thumbnail

일반적으로 개발자라면 자신이 사용하는 개발 언어에 대한 기본 개념과 특징, 사용 방법 등을 학습한다. 자바 개발자라면 JVM 기술 스택의 구조를 이해해야 한다고 생각한다. JVM 기술을 이해함으로서 더 좋은 소프트웨어를 개발할 수 있고 성능 이슈를 탐구할 때 필요한 이론적 배경지식을 갖추게 된다.

JVM

Java Virtual Machine(JVM)은 자바 바이트 코드를 실행하는 가상 머신이다. 바이트 코드는 .java 코드를 컴파일링하여 만들어진 .class 파일을 말한다.
JVM은 플랫폼(실행 환경)에 종속적이지만 구동되는 JVM이 있다면 자바 실행 파일은 어디서든 동작한다.

JVM 구조

java 명령어를 통해 자바 프로그램을 실행하면 OS는 가상 머신 프로세스(JVM)를 구동한다. 자바 가상 환경이 구성되고 사용자가 작성한 class 파일이 실행된다.

구동 과정에서 자바 애플리케이션의 진입점(entry point)은 class 파일에 있는 main() 메서드이다. 제어권을 main으로 넘기려면 가상 머신이 실행되기 전에 main 클래스를 로드 해야 한다. 이때 클래스 로더(Class Loader)가 관여한다. 따라서 자바 프로세스가 새로 초기화 된 이후 클래스 로더가 최소한의 필수 클래스(java.lang.Object, Class, Classloader, ...)들을 로드하고 컴파일된 자바 바이트코드를 런타임 데이터 영역(Runtime Data Area)에 로드하고, 실행 엔진(Execution Engine)이 자바 바이트 코드를 실행한다.

클래스 로더는 뒤에서 더 자세히 다루고 먼저 자바 메모리에 대해 설명한다.

JVM Runtime Data Area 구조

메서드 영역(method area)

  • 프로그램 실행 중 어떤 클래스가 사용되면(동적 로딩), JVM의 클래스 로더가 해당 클래스의 클래스 파일(.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이때 클래스 별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메서드(method) 데이터, 메서드 코드, 생성자(constructor) 코드 등을 분류해서 저장한다. 메서드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

Runtime Constant Pool 에는 클래스별 상수 테이블이 존재하고 리터럴 값이 포함되어 있다.

힙(heap)

  • 프로그램 실행 중 생성되는 객체와 배열은 모두 이곳에 생성된다. 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 이것을 쓰레기로 취급하고 JVM은 CG(Garbage Collector)를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거한다.

호출스택(call stack 또는 execution stack)

  • JVM 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나이다. JVM의 호출 스택은 메서드가 호출될 때 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리 공간(런타임 스택)은 반환되어 비워진다.

PC(Program Counter) 레지스터

  • 스레드마다 스레드 내 현재 실행할 instruction의 위치를 가리키는 포인터가 생성된다.

네이티브 메서드(native method)

  • 자바 외의 언어로 작성된 네이티브 코드를 위한 스택이다. 즉, JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택으로 스레드마다 언어에 맞게 C 스택이나 C++ 스택이 생성된다.

이 글은 자바 언어에 대한 기본기를 다지기 위해 작성하는 글입니다.
글에서 잘못되거나 추가되어야 하는 내용 관련 사항은 jungwoo5759@gmail.com 로 공유해주시면 감사하겠습니다.
해당 글을 참고하시거나 퍼가실 때는 출처 링크 부탁드립니다!

profile
개발이 즐거운 사람

0개의 댓글