JVM이란?

반응형
반응형

 

 

Java Virtual Machine의 약자로

직역하자면 자바 가상 머신이라고 할 수 있다. OS와의 중재자 역할을 한다. 따라서 어떤 OS를 사용하더라도 이식성이 좋다는 장점을 가지고 있다. 따라서,재사용성이 좋다. (최근에 나온 프로그래밍 언어들은 OS 이식성이 좋게 나오는걸로 알고있다.)
jvm의 역할은 크게 2가지로 구분이 되어지는데
Garbage collector과 메모리 관리기능이로 구분되어진다. 또 jvm은 스택기반의 가상머신이다. 추가적으로 arm같은 하드웨어는 레지스터기반으로 동작한다.

컴파일하는 방법
컴파일이란 바이트 코드로 만드는 것을 의미합니다.
위에서 JVM은 OS와의 중재자 역할을한다고 하였습니다.
대게 프로그래밍언어는 사람이 읽을 수 있게 설계 되어있습니다.하지만 기계인 컴퓨터는 사람이 작성한 코드를 읽을 수 없습니다. 그래서 컴퓨터가 읽을 수있게 변환되어져야합니다.

1.프로그래머가 자바코드를 작성합니다.
2. .java파일로 저장이 됩니다.
3. jvm에서 자바파일을 .class파일로 바꿉니다.
4. .class 파일이 바로 바이트코드입니다.

하지만 바이트코드 역시 기계가 이해할 수 없는 코드입니다.

실행하는 방법
이제 인터프리터를 이용해서 바이트 코드를 기계가 읽을 수 있는 형태로 만들어야 합니다.인터프리터로 바이트코드를 해석해서 어떤 OS든지 이해할 수 있게 변환시켜줍니다.
이렇게 2번 반복하는 이유는 machine independent특성 때문입니다. 즉,어떤 기계를 사용하더라도 바이트코드를 이해가 가능하다는 뜻입니다.

JIT컴파일러
JIT는 Just It Time의 약자로 '실시간'이라는 뜻을 가지고 있습니다. 그러니까 실시간으로 컴파일하라는 뜻입니다. 실시간으로 하는 방법 중 가장간단한 방법은 중복을 제거하는 것입니다. (완벽한 실시간은 아닙니다.) 여기서의 중복은 바이트코드를 의미합니다. 가장 대표적인 중복바이트코드는 컴파일이 최초로 만들어질때 생성된다고 합니다.원래는 코드를 실행할때마다 이 중복되어진 바이트코드를 해석해야되지만, JIT를 이용한다면 최초 1회만 실행하면 됩니다.
왜냐하면 이미 만들어졌기때문이죠. 이제 사용자는 코드를 실시간으로 컴파일이 가능하게 되었습니다. 최초 1회는 실시간이 아니지만요ㅎ

JVM의 구성요소
   1. class Loder : 인터프리터로 해석하기위허서는 자바코드를 바이트 코드로 바꿔야됩ㅂ니다. 즉, class Loder에서 .java코드를 .class 코드로 바꿔주는 역할을 합니다. 그리고 메모리영역인 Runtime Data Area에 적재하는 역할을 맡았습니다.
   2.Execution Engine : class Loder을 이용해서 적재된 바이트코드를 기계어로 바꿔주는 역할을 합니다. 이때 2가지 방법으로 기계어로 바꿀 수 있는데 인터프리터 방식과 JIT 방식이 존재합니다. 인터프리터 방식은 명령어 한줄 마다 변경시켜주는 방식이고 JIT방식은 인터프리터 에 비해 훨씬 빠르게 변경이 가능합니다. JVM은 JIT 컴파일 방식을 채택하여 네이티브로 컴파일이 가능하다는 장점이 있습니다.
   3.Garbage Collector : heap메모리에 생성된 객체들중 참조되지않는 객체들의 메모리를 자동으로 해제해주는 역할을 합니다. 또 다른 특징은 GC에서 관리되는 스레드가 종료가 되면 관리되지 않는 스레드들은 일시 정지됩니다. 만약, Full Gc가 일어나게되면 모든 스레드가 정지되기때문에 심각한 장애가생길 수 있습니다.
   4.Runtime Data Area : JVM에서 메모리를 적재할때 사용된다. 대표적으로 스택,힙이 존재한다.
      1) Method area 메소드 영역 : 클래스 맴버 정보가 생성한다.
      2) Heap area 힙 영역 : new 키워드로 생성된 객체를 생성한다.
      3) Stack area 스택 영역: 지역 변수, 파라미터, 리턴값, 연산 에 사용되는 임시변수가 생성된다.
      4) PC Register : 스레드가 생성될때마다 생성되는 영역이다.
      5) Native method stack : JVM언어외로 작성된 네이티브 코드가 작성된 영역이다. C /C++등의 코드를 위해 수행하는 스택이다.

 

 


JDK 와 JRE의 차이
  JRE: Java Runtime Enviroment의 약자로 자바 프로그래밍이 실행하는 런타임 시스템입니다.

  JDK: Java Developer Kit의 약자로 자바 개발에 필요한 kit입니다.

  이 둘의 가장 큰 차이점은 JRE는 자바 프로그래밍이 실행되는 환경이고, JDK는 자바 소프트웨어 키트입니다.  
  이름만 들어서는 JRE가 기능상으로 볼때 최 상위에 있을 것 같지만, 실은 JDK가 최상위에 존재합니다. 
  JDK > JRE > JVM 순으로 정렬이 됩니다. 이로써 JRE또한 자바 개발하는데 필요한 기능중 하나인것을 알 수 있습니다.

이렇게 자바가 어떻게 동작하는지 살펴 보았습니다.  자바를 공부해왔지만, 이렇게 동작하는지 이번 기회에 알 수 있었습니다.

출처 : 1) 12bme.tistory.com/382
        2) https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
        3) https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45           4) https://jeong-pro.tistory.com/m/148 
        5) c10106.tistory.com/3135
        6) www.onlinetutorialspoint.com/java/jdk-jre-jvm-and-differences.html

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

연산자  (0) 2020.11.26
자바 데이터 타입, 변수 그리고 배열   (5) 2020.11.18
서블릿과 JSP  (0) 2020.09.24
public , default, protected, private  (0) 2020.07.30
내가 쓰레드를 이해한 방법  (0) 2020.06.24

댓글

Designed by JB FACTORY