Java

[Java] JVM 구조

림 림 2020. 10. 25. 19:30
반응형

1. JVM이란?

JVM은 Java Vritual Machine의 약자로, 자바 애플리케이션을 실행하는 가상의 기계입니다. JVM은 자바 바이트 코드를 운영체제에 맞는 바이너리 코드(기계어)로 변환하여 프로그램을 실행하기 때문에 운영체제에 종속적입니다. 자바 외에도 Groovy, Kotlin, JRuby 등의 다양한 프로그래밍 언어로 작성된 프로그램이 JVM에서 실행될 수 있습니다.

 

2. JVM의 구조

JVM 구조 개요

JVM은 크게 다섯 가지 구조로 구성되어 있습니다.

  • 클래스 로더 시스템
  • 메모리
  • 실행 엔진
  • 네이티브 메소드 인터페이스
  • 네이티브 메소드 라이브러리

 

2-1. 클래스 로더 시스템

클래스 로더 시스템은 .java 파일의 소스코드를 컴파일한 .class 파일의 바이트 코드를 읽어서 운영체제에 맞는 바이너리 코드로 바꾸어 메모리의 적절한 위치에 배치합니다. 

 

2-2. 메모리

JVM 메모리 구조

메모리는 다시 다양한 영역으로 구분될 수 있습니다. 그 중에 주요 다섯가지 영역으로 메소드(스태틱), 힙, 스택, PC, 네이티브 메소드 스택 영역이 있습니다.

1) 메소드(스태틱) 영역
메소드 영역에는 클래스에 대한 정보가 저장됩니다. 패키지명까지 포함된 클래스의 이름, 부모 클래스의 이름이 저장됩니다. 모든 클래스는 java.lang.Object 클래스를 상속받기 때문에 이 정보도 저장됩니다. 또, 인스턴스 멤버가 아닌 static 키워드가 붙은 클래스 멤버 변수, 클래스 멤버 메소드가 저장됩니다. 

2) 힙 영역
힙 영역에는 생성된 객체들에 대한 정보가 저장됩니다.

3) 스택 영역
스택 영역에는 스레드마다 메소드가 호출될 때마다 스택 프레임을 만들어 해당 메소드에 대한 정보를 저장합니다. 메소드의 실행이 끝나면 해당 스택 프레임이 사라집니다.

4) PC
PC는 Program Counter의 약자로 스레드마다 실행할 메소드의 스택 프레임의 주소값이 저장됩니다. 

5) 네이티브 메소드 스택
네이티브 메소드가 호출될 경우 해당 스택 프레임을 만들어 해당 네이티브 메소드에 대한 정보를 저장합니다. 

네이티브 메소드란?
네이티브 메소드는 자바가 아닌 다른 언어로 구현된 메소드입니다. 
네이티브 메소드의 앞에는 native 키워드가 붙어있습니다. 
그 예로 현제 스레드를 가져오는 Tread.currentThread() 메소드가 있습니다. 

 

2-3. 실행 엔진

JVM 실행 엔진 구조

실행 엔진은 자바 바이트 코드로 컴파일된 프로그램을 실행하는 역할을 수행합니다.

1) 인터프리터(Interpreter)
자바 바이트 코드를 한 줄 한 줄 운영체제에 맞는 바이너리 코드로 변환하여 실행합니다.

2) JIT(Just In Time) 컴파일러
자바 바이트 코드 중 반복되는 부분을 미리 바이너리 코드로 변환해 둡니다. 인터프리터는 반복되는 코드를 매번 변환하지 않아도 되고 미리 변환된 코드를 실행하기만 하면 됩니다. 

3)  가비지 컬렉터 (Garbage Collcetor)
자바에서 객체가 생성되면 힙 메모리에 저장됩니다. 객체가 객체 참조 변수에 할당되면 객체 참조 변수에는 해당 객체가 저장되어 있는 힙 메모리의 주소값이 저장됩니다. 만약 객체 참조 변수에 다른 값이 저장되어 더이상 객체를 참조하는 변수가 없다면 가비지 컬렉터가 해당 부분의 힙 메모리를 비웁니다.

 

2-4. 네이티브 메소드 인터페이스

네이티브 메소드 라이브러리에 있는 네이티브 메소드를 사용하기 위한 인터페이스입니다. native 키워드가 붙은 메소드의 이름과 같은 인터페이스를 통해 네이티브 메소드 안에 구현된 로직을 실행할 수 있습니다. 

 

2-5. 네이티브 메소드 라이브러리

네이티브 메소드가 구현되어 있는 라이브러리를 말합니다. 네이티브 메소드 라이브러리에 접근하기 위해서는 네이티브 메소드 인터페이스를 거쳐야 합니다.

반응형