반응형

JVM

 

JVM(Java Virtual Machine)이란?

 

자바 바이트 코드를 실행할 수 있는 주체로 일반적인 프로그램이 OS 위에서 동작하는 반면 자바 프로그램은 OS위의 JVM이 올라가고 그 JVM위에서 프로그램이 동작한다. 때문에 이론적으로 모든 자바 프로그램은 기타 하드웨어, OS의 종류에 독립적으로 동작한다.

 

 

1. JVM 구조

 

* Java Compiler : 자바 소스코드(.java) 파일을 JVM이 해석할 수 있는 JAVA Byte Code(.class)파일로 변경한다. 

 

JVM은 크게 다음 4가지 모듈로 구성된다.

 

1. Class Loader

JVM 내로 .class 파일 및 필요 라이브러리들을 로드한다. 로드된 클래스 및 라이브러리들은 링크에 의해 Runtime Data Area에 적절히 배치된다.

 

2. Execution Engine

로드된 클래스의 Byte Code(어셈블리어)를 해석하여 OS가 해석할 수 있는 Binary Code(기계어) 파일로 변경한다.

 

3. Runtime Data Area

JVM이 OS로부터 할당 받은 메모리 영역

 

4. Garbage Collector

메모리 관리 역할을 수행. 자바 프로그램(Instance 혹은 Application)에서 필요한 메모리를 요청하여 부여하고 필요 여부를 판단하여 사용되지 않는 메모리는 반납(==malloc(), free())

 

 

2. JVM 메모리(Runtime Data Area) 구조

 

 

JVM 메모리 구조는 크게 다음 5가지 영역으로 나누어진다.

 

1. PC Register(Per Thread)

현재 수행 중인 JVM 명령의 주소를 가지고 있다.

 

2. JVM Stack(Per Thread)

스택 프레임 구조체를 저장하는 스택으로 FILO로 프레임이 관리된다.

 

3. Native Method Area(Per Thread)

자바 외의 언어로 작성된 코드를 위한 영역으로 JNI(Java Native Interface)을 통해 호출하는 자바 외 코드를 수행하기 위한 스택으로 언어에 맞게 C or C++ 스택이 생성된다.

 

4. Method Area

JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 필드, 메서드, 변수, 메서드의 바이트 코드 등을 보관한다. 가장 핵심이 되는 영역이 런타임 상수 풀로 모든 레퍼런스를 담고 있으며 해당 영역을 통해 메서드나 필드의 실제 주소를 찾아서 참조한다.

 
5. Heap : 인스턴스 또는 객체를 저장하는 공간으로 GC에 의해 관리된다. Heap은 또 다시 다음과 같이 3개의 영역으로 나누어진다.

 

 

5-1) New/Young 영역 : 새로 생성된 객체를 저장
5-2) Old 영역 : 만들어지진 오래된 객체를 저장. New 영역의 객체가 일정 시간이 지나면 Old로 이동
5-3) Permanent 영역 : JVM 클래스와 메서드 객체를 저장

 

 

3. 동작 시나리오

 

1. Java(고급언어) 파일이 컴파일러에 의해 class(어셈블리어) 파일로 변환

 

2. 클래스 파일 및 필요 라이브러리들이 Class Loader에 의해 JVM으로 로드 

 

3. class(어셈블리어)파일이 기계어로 변환되고 링크에 의해 적절한 메모리 위치에 링킹 

 

4. 어플리케이션 실행 

 

 

반응형

'Java' 카테고리의 다른 글

[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
Spring 개발 환경 세팅  (0) 2018.06.02
Java 개발 환경 세팅  (0) 2018.02.03

+ Recent posts