[JAVA] JVM이란?
[JAVA] JVM이란?
JVM(Java Virtual Machine)
JVM사용 이유 : 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서
- Java Byte Code를 OS에 맞게 해석 해주는 역할
- Java compiler가 .java파일을 .class라는 Java byte code로 변환시켜 줌
- Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않음
- JVM은 OS가 ByteCode를 이해할 수 있도록 해석 해줌
- Java와 OS 사이의 중계자 역할
- 메모리관리, Garbage Collection 역할
- JVM의 해석을 거치기 때문에 C언어 같은 네이티브 언어에 비해 속도가 느리지만 JIT(Just In Time)컴파일러를 구현해 극복함
- Byte Code는 JVM위에서 OS에 상관없이 실행됨
- OS에 종속적이지 않고 Java파일 하나만 만들면 어느 디바이스든 JVM위에서 실행 가능
- JVM은 크게 3가지로 구성됨
- ClassLoader
- Runtime Data Areas
- Excution Engine
Class Loader
- RunTime시점에 클래스를 로딩하게 해주며, 링크릉 통해 배치하는 작업을 함
- 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 됨
Runtime Data Areas
- JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 받은 메모리 공간
- 크게 5가지로 나눌 수 있음
- PC Register
- Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 thread마다 하나씩 존재
- Thread가 어떤 부분을 어떤 명령으로 실행해야 할지에 대한 기록을 함
- 현재 수행중인 JVM 명령의 주소를 가짐
- Java Virtual Machine Stack
- 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
- 각종 형태의 변수나 임시 데이터, 쓰레드나 메소드의 정보를 저장
- Native Method Stack
- 자바가 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- JAVA가 아닌 다른 언어로 작성된 코드를 위한 영역
- Method Area
- 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
- 올라가게 되는 메소드의 바이트 코드는 프로그램의 흐름을 구성하는 바이트 코드
- Heap
- 객체를 저장하는 가상 메모리 공간
- new연산자로 생성된 객체와 배열을 저장
Execution Engine
- Load된 Class의 ByteCode를 실행하는 Runtime Moduel이 바로 Execution Engine
- Class Loader를 통해 JVM내의 Runtime Data Areas에 배치된 byte code는 Execution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 최초 JVM이 나왔을 당시에는 Interpreter방식(한 줄씩 해석하고 실행)이였기 때문에 속도가 느리다는 단점이 있었지만 JIT compiler 방식을 통해 이점을 보완함
- JIT는 ByteCode를 어셈블러 같은 NativeCode로 바꿔서 실행은 빠르지만, 변환하는데 비용이 발생.
- 물론 JIT 컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅하는 것보다 훨씬 오래 걸리므로, 한번만 실행하는 코드는 인터프리팅 방식이 유리
- 이 같은 이유로 JVM은 모든 코드를 JIT Compiler방식으로 실행하지 않고 Interpreter방식을 사용하다 일정한 기준이 넘어가면 JIT Compiler방식으로 실행함
출처
댓글
댓글 쓰기