SMALL

JVM이란?


기술 면접 및 필기 시험에서 단골로 나오는 JVM에 대해 설명을 하겠습니다.

JVM은 Java Virtual Machine의 줄임말이며 자바 바이트 코드를 OS에 맞게 해석 해준다. 자바 컴파일러는 java 파일을 자바 바이트 코드로 변환시켜 .class 파일을 생성 시킨다. 바이트 코드는 기계어가 아니므로 OS에서 바로 실행 되지 않는다. OS가 바이트코드를 이해시켜주도록 도와주는 것이 JVM이다.

바이트 코드는 JVM위에서 OS 상관없이 실행된다. 이것이 Java의 가장 큰 장점 중 하나이다.


JVM 구조



JVM 구조는 3가지 영역으로 나누어진다.


1) Class Loader

런타임 시점에서 클래스를 로딩하여 클래스의 인스턴스를 생성하여 클래스 로더를 통해 메모리에 로드하게 된다.


2) Runtime Data Areas

JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 밭은 메모리 공간이며, 크게 5가지 영역으로 나눌 수 있다.

  • PC Regisiter

 1. 스레드가 생성 될 때마다 생성되는 공간

 2. 스레드가 어떤 부분을 어떤 명령으로 실행할 지 기록

 3. 현재 실행되는 부분의 명령과 주소를 저장

 4. Native Method를 수행할 때는 PC Register는 Undefined 상태가 된다. 이것은 JVM을 거치지 않고 바로 API를 통해 바로 수행하게 된다는 의미인데, JAVA는 플랫폼에 종속 받지 않는 것을 의미한다.


  • JVM Stack
 1. 매서드가 호출되면 매서드와 매서드 정보를 스택에 쌓게된다.
 2. 매서드의 매개변수, 지역변수, 임시변수, 매서드 호출한 주소를 저장 
 3. 매서드 종료 시 메모리 공간에서 사라짐
  • Native Method Stack
 1. Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack

 2. JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 Stack

 3. JNI를 이용하여 JVM 내부에 영향을 주지 않기 위해서이다.


  • Method Area
 1. 모든 쓰레드가 공유하는 메모리 영역

 2. 클래스, 인터페이스, 매서드, 필드, Static 변수를 저장


  • Heap
 1. 런타임시 동적으로 할당하여 사용 하는 영역
 2. new 연산자로 생성된 객체와 배열을 저장

3) Execution Engine

Load된 클래스의 바이트코드를 실행하는 런타임 모듈이 Execution Engine이다.
클래스 로더를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드는 Execution Engine에서 실행되며, 자바 바이트 코드를 명령어 단위로 읽고 실행



자주 나오는 질문


1. Stack 영역에서 메모리의 제한된 크기 이상을 사용하게 되면 오버플로우가 발생한다.

2. Heap 영역에서 메모리 할당/해제 동작이 반복되면 메모리 단편화 현상이 일어난다.

3. Heap 영역과 Stack 영역에 대한 메모리 접근속도는 Stack가 훨씬 빠르다. 왜냐하면 Stack는 미리 할당 된 공간을 사용하는 것이고 Heap은 사용시마다 할당 되기 때문이다.


LIST

'전공 > JAVA' 카테고리의 다른 글

JNI  (0) 2020.06.24
try-with-resource  (0) 2018.07.08
컬렉션  (0) 2018.05.13
접근제어자  (0) 2018.05.02
오버라이딩과 오버로딩  (0) 2017.11.24

+ Recent posts