새소식

반응형
Java/Spring

JVM, JRE, JDK 차이

  • -
반응형

JVM (Java Virtual Machine)

JVM은 Java Virtual Machine으로 Java와 OS 사이에서 가장 중요한 중간자 역할을 한다.

자바 컴파일러(javac)가 개발자가 작성한 소스코드(.java)를 컴파일하면 바이트 코드(.class)가 된다.

이렇게 변환된 바이트 코드(.class)를 해당 OS에 맞게 기계어로 해석해주는 역할을 수행하는게 JVM이다.

간단하게 얘기하면 자바 소스코드로부터 컴파일되어 만들어진 바이트 코드(.class) 를 운영체제가 이해할수 있도록 해석하고 실행시킨다. JVM의 영향으로 인해 JAVA라는 언어는 이식성이 좋은거다.

 

출처 : https://steady-coding.tistory.com/305

여기서 의문점이 있을 수 있다. C언어는 소스를 컴파일하면 OS에서 바로 실행할 수 있는 실행파일 또는 기계어로

컴파일되는 반면 자바와 같은 JVM 언어는 바로 기계어로 컴파일 하지 않고 바이트코드(.class)로 변환하여 JVM이

바이트코드를 실행하는 방식을 사용하는지 의문점이 들 수 있다.

C언어는 컴파일하면 바로 OS에서 바로 실행할 수 있지만 OS가 바뀔때마다 그에 맞게 실행파일을 바꿔줘야 한다.

하지만 Java 언어는 컴파일 된 바이트코드(.class)파일을 JVM이 OS에 맞게 변환하여 실행시켜주기 때문에 이식성이 좋다.

 

JVM 구조

출처 : https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2

JVM은 크게 4가지의 구성요소로 볼 수 있다.

- Class Loader

- Runtime Data Area

- Execution Engine

- Garbage Collectors(GC)

 

Class Loader

Runtime 시점에 개발자가 작성한 .java 파일들을 Java Compiler에 의해 컴파일 되면 .class 파일이 생성된다.

이러한 .class 파일들을 묶어서 JVM이 운영체제로부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는

역할을 클래스로더가 한다.

쉽게 말해 .class 파일들을 메모리에 적재한다.

 

Runtime Data Area

JVM이 프로그램을 실행하기 위해 OS로 부터 별도로 할당 받은 메모리 공간을 말하며 자바 어플리케이션을 실행할 때

사용되는 데이터들을 적재하는 영역이다.

이 영역은 크게 Method Area, Heap Area, Stack Area, Native Method Stack, PC Register가 있다.

 

    1. Method Area

    모든 쓰레드가 공유하는 메모리 영역이다. 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를

    보관한다.

 

    2. Heap Area

    ​모든 쓰레드가 공유하며 new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. (ClassTest a = new ClassTest();)

    런타임시 동적으로 할당되며 사용자가 관리하는 인스턴스가 생성되는 공간이다.

 

    3. Stack Area

    메소드 호출 시 메소드에서 사용하는 매개변수, 지역변수, 리턴 값 및 연산시 일어나는 값들을 임시로 저장하는

    공간이다. 메소드 종료 시 사용한 메모리는 삭제된다.

 

    4. PC Register

    쓰레드가 시작될 때 생성되며 쓰레드마다 하나씩 존재한다. 쓰레드가 어떤 부분을 무슨 명령으로 실행 해야할지에

    대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.

 

Execution Engine(실행 엔진)

Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드들을 실행시키는 역할을 한다.

바이트 코드를 명령어 단위로 읽어서 실행시킨다.

 

최초 JVM이 나왔을때는 인터프리터 방식(한줄씩 해석하고 바로 실행)이였기 때문에 속도가 느리다는 단점이 있었다.

이러한 단점을 JIT Complier 를 사용하여 보완했다. JIT 는 Byte Code를 어셈블러 같은 Native Code로 바꿔서 실행이

빠르지만 역시 변환하는데 비용이 발생한다. 이러한 이유 때문에 JVM은 모든 코드를 JIT Compiler 방식으로 실행하지

않고 인터프리터 방식을 사용하다 일정한 기준이 넘어가면 JIT Compiler 방식으로 실행한다.

 

JIT Compiler는 바이트 코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램이다.

바이트 코드를 CPU가 제대로 이해할 수 있는 기계어로 변환되어야 한다. 이러한 역할을 JIT 컴파일러가

바이트 코드를 CPU가 이해할 수 있는 기계어로 변환하는 역할을 한다.

JRE (Java Runtime Environment)

: 자바 실행환경

: JVM이 동작할수 있도록 필요한 라이브러리와 기타 파일들을 가지고 있다.

JDK (Java Development Kit)

: Java 개발을 위한 필요 도구들을 가지고 있다.

반응형

'Java > Spring' 카테고리의 다른 글

@SelectKey, <selectKey>  (0) 2021.08.25
Spring - Dynamic Web Project 설정  (0) 2021.08.25
C언어와 Java 언어의 차이점  (0) 2021.08.25
DAO와 DTO를 분리하는 이유  (0) 2021.08.25
자주 쓰는 어노테이션 정리  (0) 2021.08.25
Contents

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

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