새소식

반응형
Java

[Java] Java JVM이란, JVM 구성 (Java Virtual Machine)

  • -
반응형

JVM이란

JVM은 Java Virtual Machine의 약자이다.

Java는 알겠고, Virtual Machine은 여기서 무엇을 의미할까?

Virtual Machine(가상 머신)은 프로그램의 실행하기 위해 물리적 machine과 유사한 machine을 소프트웨어로 구현한 것이라고 할 수 있다. 

그럼 자바와 가상머신을 합친 통합적인 의미로 정의해 보면 

자바 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)이라고 할 수 있다.

 

JVM의 정의는 대충 알겠고, 그럼 다음으로 역할과 특징으로는 어떠한 것들이 있는지 대략적으로 정리해 보자

  •  JAVA와  OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 준다
  • 메모리 관리, Garbage collection 수행
  • 클래스 로더를 통해 class파일을 로드해주고,  실행시켜준다
  • 스택 기반의 가상 머신
    (ARM 아키텍처 같은 하드웨어는 레지스터 기반으로 동작하는데 비해 JVM은 스택 기반으로 동작)

JVM 구성

JVM은 크게 3가지 부분으로 나눌 수 있다

  • 클래스 로더(Class Loader) - class file 및 libraries를 읽어 들여 클래스 객체를 생성
  • 데이터 영역(Runtime data area) - 로딩된 Class를 수행하기 위해 할당받은 메모리 공간
  • 실행 엔진(Excecution engine) - 로딩된 Class를 실행

각각의 요소들은 JVM의 중요한 역할을 담당하고, 부연 설명할 부분이 많다.

그러므로 각각의 포스팅을 통해서 자세하게 설명하고, 지금은 간단하게 특징들을 서술하도록 하겠다. 

jvm구성:image출처(https://itkmj.blogspot.com/2018/05/jvm.html)

 


Class Loader

Class Loader는 자바의 큰 장점 중의 하나로, Compile Time이 아닌 Run Time에 Class를 로딩할 수 있게 해주는 기술

자바는 동적으로 클래스를 읽는다.

런타임 시에 모든 코드가 JVM에 링크, 로딩되는 것이다.

자바의 런타임 라이브러리인 rt.jar 도 마찬가지다.

자바는 기본적으로 java.lang.ClassLoader라는 ClassLoader를 제공

동적으로 클래스를 로딩한다는 것은 JVM은 클래스에 대한 정보(메서드, 필드, 상속관계)를 가지고 있지 않다는 것을 의미 (이러한 정보 역시 동적으로 확인되며 검증) 

클래스 로딩 방식에는 load-time dynamic loading과 run-time dynamic loading이 있다


데이터 영역

데이터 영역은 크게 다음과 같이 나눠서 살펴볼 수 있다.
(힙, 메서드)는 전체 공유자원으로 분류

(스택, PC, 네이티브 메서드 스택)은 쓰레드 단위의 자원으로 분류

 

메소드 

  • 클래스 수준의 정보를 저장
  • 클래스 이름, 부모 클래스 이름, 메서드, 변수 등
  • static 변수, 일반 변수 등

- 객체(인스턴스) 수준의 정보를 저장

 

스택 - 인스턴스 및 지역 변수의 참조 주소 들을 저장
         스레드마다 런타임 스택을 만들고, 스택 프레임(메소드 call)을 쌓는다

 

PC - 쓰레드마다 가지고 있는 Program Counter
       현재 실행할 부분을 가리키고 있다

 

네이티브 메서드 스택

  • 네이티브(native) 메소드 호출할 때 사용하는 별도의 스택
  • 네이티브 메서드는 java 가 아닌 c와 같은 언어(low-level) 로 구현된 메소드
    예시 : Thread.currentThread() 
    public static native Thread currentThread()로 선언

실행 엔진

실행 엔진은 클래스 로더가 클래스를 로딩하는 작업을 마치면, JVM은 각 클래스에 있는 코드를 실행

자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다. 

그래서 실행 엔진은 이와 같은 바이트코드를 실제로 JVM내부에서 기계가 실행할 수 있는 형태로 변경한다

 

 

참고 블로그 :)

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.