본문 바로가기
Java

[Java] JVM의 구조와 이해

by parkjp 2017. 9. 8.

1. JVM (Java Virtual Machine)이란?

 

 자바 가상 머신(Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 

 

자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

 

 

* JVM의 특징

 

A. 스택 기반의 가상 머신

 

B. 단일 상속 형태의 객체 지향 프로그래밍을 가상 머신 수준에서 구현

 

C. 포인터를 지원하되 C와 같이 주소 값을 임의로 조작이 가능한 포인터 연산이 불가능

 

D. 가비지 컬렉션 사용

 

E. 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장

 

F. 데이터 흐름 분석(Data flow analysis)에 기반한 자바 바이트코드 검증기(Verifier)를 통해 스택 넘침, 명령어 피연산자의 타입 규칙 위반, 필드 접근 규칙 위반, 지역 변수의 초기화 전 사용 등 많은 문제를 실행 전에 검증하여 실행 시 안전을 보장하고 별도의 부담을 줄여줌

 

G. 명령어에서 스택에서 가져올 피연산자의 타입을 명령어에 지정(예: 정수 덧셈은 iadd, 단정도 실수 덧셈은 fadd)

 

 

2. JVM의 구조

 

 

 

 

- Class Loader : JVM내로 class를 로드하고 Link를 통해 적절히 배치하는 일련의 작업을 수행하는 모듈.

 

- Execution Engine : class loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 실행 엔진에 의해 실행, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행

 

- Garbage Collector : JVM은 Garbage Collector를 통해 자동화된 메모리 관리 기능을 제공.

Garbage Collection을 수행하는 모듈 쓰레드. Application이 생성한 객체의 생존 여부를 판단해서 더 이상 사용되지 않는 객체를 해제함으로써 메모리 관리가 자동화 되도록 한다.

 

- Runtime Data Areas : JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역. 런타임 데이터 영역은 6개의 영역으로 나뉜다.

 

 

 영 역 용 도  스레드 공유 
 Method
(Static) Area
JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 메소드와 필드, Static 변수, 메소드 바이트 코드 등을 보관.  모든 스레드
에서 공유
Runtime
Constant
Pool 
 Method Area 영역에 포함되지만 독자적 중요성이 있다.
클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스 저장, JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다.
Heap

Area
프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역. new 연산자로 생성된 객체 또는 인스턴스와 배열을 저장.
 Stack
Area
 선입후출(FILO) 구조. 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장. 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장. 각 스레 
별로 생성 
PC
Register 
 현재 수행 중인 JVM 명령 주소를 갖는다. 연산 결과 값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
Native
Method
Stack Area 
 자바 외 언어로 작성된 네이티브 코드를 위한 Stack. 즉 JNI(Java Native Interface)를 통해 호출하는 C/C++ 등의 코드를 수행하기 위한 스택. native 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장.

 

 

3. 힙 영역 (Heap Area)의 구조

 

 

 

 

 

- New/Young Generation : Java 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간,  java 객체가 생성되면 이 영역에 저장되다가, 시간이 지남에 따라 우선순위가 낮아지면 Old영역으로 옮겨진다. 이 영역에서 사라질 때 Minor GC가 발생한다.

 

- Old(Tenured) Generation : Young Generation 영역에서 저장되었던 객체 중에서 오래된 객체가 이동되어서 저장되는 영역, 이 영역에서 객체가 사라질 때 Major GC(Full GC)가 발생한다.

 

- Permanent Generation : Class loader에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역으로 JVM에 의하여 사용된다. Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 Reflection 기능을 자주 사용하는 Spring Framework를 이용할 경우 이 영역에 대한 고려가 필요하다.

 

 

 

 

 

참고 : 

- 위키백과, "자바가상머", 링크, (2017.09.08)

- hipercube, "JVM과 메모리구조", 링크, (2017.09.08)

반응형