ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM 이란?
    Java 2020. 4. 22. 15:22

    JVM?

    Java Virtual Machine 의 줄임말 이며 Java Byte Code를 OS에 맞게 해석 해주는 역활을 합니다. Java Compiler는 .java 파일을 .class 라는 Java Byte Code로 변환 시켜 준다. (Byte Code는 기계어가 아님으로 OS에서 바로 실행되지 않는다.)

    OS에서 Byte Code를 읽을 수 있도록 JVM이 해석을 해 준다.

    하지만 JVM 해석을 거치고 가기 때문에 C언어 같은 네이티브 언어에 비해 속도가 느려졌다. * JIT 컴파일러를 구현해 이점을 극복했다.

    Byte Code는 JVM 위에서 OS 상관없이 실행된다 (JAVA 장점)

    *JIT (just-in-time)

    실행하기 전에 처음 한 번 하는 컴파일 대신 프로그램 실행하는 시점에는 필요한 부분을 즉석으로 커뮤파일하는 방식을 말한다.

     

    자바 가상 머신 사양의 자바 SE 7 에디션에 기반을 둔 자바 가상 머신(JVM) 아키텍처의 개요도.

    JVM 메모리 구조

    응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그중 주요영역(①Method Area, ②Call Stack, ③Heap)이 있다.

    ⑴ Method Area : 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수도 이 영역에 함께 생성된다.

    ⑵ Call Stack : 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

    Heap : 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. (인스턴스 생성 공간)

    JVM 구조

    JVM은 크게 Class Loader, Runtime Data Areas, Excution Engine 3가지로 구성되어있다.

     

    Class Loader

      RunTime 시점에 클래스를 로딩하게 해주며, 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다.

    Runtime Data Areas

     JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 받은 메모리 공간을 의미하며, Runtime Data Areas는 크게 5가지 영역으로 나뉜다. (①PC Register, ②Java Virtual Machine Stack, ③Native Method Stack, ④Method Area, ⑤Heap)

    ⑴ PC Register : 프로그램의 실행은 CPU에서 명령어, 즉 instruction을 수행하는 과정으로 이루어진다. CPU는 이러한 실행을 수행하는 동안 필요한 정보를 레지스터라고 하는 CPU내의 기억장치를 사용한다. Java 의 PC REgister 는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다. Register-Base 가 아닌 Stack -Base 로 동작한다. PC Register 는 각 Thread 별로 하나 씩 존재하며 현재 수행 중인 Java Vitual Machine Instruction 의 주소를 가지게 된다. 만일 Native Method 를 수행 한다면 PC Register 는 Undefined 상태가 된다. 이 PC Register 에 저장되는 Instruction 의 주소는 Native Pointer 일 수도 있고 Method Byete Code 일 수 있다. Native Method 를 수행할때 JVM  JVM 을 거치지 않고 API를 통해 바로 수행하게 된다. 이 는 Java 는 Platform 에 종속 받지않는 다는 것을 보여준다.

    ⑵ Java Virtual Machine Stack : Java Virtual Machine Stacks 은 Thread의 수행 정보를 Frame을 통해서 저장하게 된다. Java Virtual Machine Stacks는 Thread가 시작될때 생성되며, 각 Thread별로 생성이 되기 때문에 다른 Thread는 접근할 수 없다. Method 가 호출 되면 Method와 Method정보는 Stack에 쌓이게 되며 Method 호출이 종료 될때 Stack point에서 제거 된다. Method 정보는 해당 Method의 매개변수, 지역변수, 임시변수 그리고 어드레스(메소드 호출 한 주소) 등을 저장하고 Method 종료시 메모리 공간이 사라진다.

    Native Method Stack : Java 외 언어로 작성된 네이티브 코드들을 위한 Stack, 즉 JNI를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 Stack Native Method를 위해 Native Method Stack이라는 메모리 공간을 갖는다. Application에서 Native Method를 호출하게 되면 Native Mehod를 호출하게 되면 Native Method Stack에 새로운 Stack Frame을 생성하여 push 한다. 이는 JNI를 이용하여 JVM 내부에 영향을 주지 않기 위함이다.

    ⑷, ⑸ Mehod Area, Heap 은 위에서 간단히 설명했기에 생략한다...

    Runtime Data Areas

    Load된 Class의 ByteCode를 실행하는 Runtime Module이 바로 Execution Engine 이다. Class Loader를 통하여 JVM 내의 Runtime Data Areas 에 배치 된 바이트 코드를 명령어 단위로 읽어서 실행한다.

     

    최초 JVM이 등장했을때는 한줄씩 번역 실행하는 인터프린터 방식이여서 속도가 느리다는 단점이 있었지만 JIT Compiler방식을 통하여 이점을 보완했다. 그리고 JIT는 ByteCode를 어셈블러 같은 NativeCode로 바꿔서 실행을 하면 빠르지만 역시 변환에 금전적 비용이 환산된다. 그렇기에 JVM은 모든 코드를 JIT Compiler 방식으로 실행하지 않고 인터프린터 방식을 사용하다 일정 기준이 넘어가면 JIT Compiler 방식으로 실행하게 된다.

     

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

    출처: Java의 정석

    'Java' 카테고리의 다른 글

    메서드 메모리관리  (0) 2020.06.17
    jMeter 사용하기 (with MQTT)  (2) 2020.05.12
    소켓 통신 I/O Stream  (0) 2020.05.07
    JNI 사용하여 Native Method를 가동시켜 HelloWorld를 찍기  (0) 2020.04.24
    JNI란?  (0) 2020.04.23

    댓글

Designed by Tistory.