Live-Study

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. #1

WOOKTAE 2021. 2. 21. 22:44
  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

1. JVM 이란 ?

- JVM ( Java Virtural Machine )  자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체이다. 

Java Byte Code 를 OS 에 맞게 해석 해주는 역할을 합니다. Java Compiler 는 .java 파일을 .class 라는 Java Byte Code로 변환 시켜 줍니다. Byte Code 는 기계어가 아니기 때문에 OS에서 바로 실행되지 않습니다. 이때 JVM은 OS 가 Byte Code를 이해할 수 있도록 해석해 줍니다. JVM의 해석을 거치기 때문에 C언어 같은 네이티브 언어에 비해 속도가 느렸지만  JIT(JUST IN TIME)컴파일러를 구현해 이점을 극복했습니다. Byte Code는 JVM 위에서 OS 에 상관없이 실행된다. 이런 점이 Java의 가장 큰 장점이라고 할 수 있습니다. 

JVM 은 크게 Class Loader, Runtime Data Areas, Excuting Engine, Garbage Collctor 4가지로 구성되어 있습니다.

 

출처  : https://jeong-pro.tistory.com/148

  • Class Loader
    • 예를들어 자바에서 코딩시 a.java 파일이 생성된다고 하면 .java 소스를 자바컴파일러(javac)가 컴파일 하여 a.class 같은 클래스 파일(바이트코드)로 변환해준다. Class Loader 는 이러한 class 파일들을 모아서 JVM이 운영체로 부터 할당받은 메모리 영역인 Runtime Data Area로 적재하는 역할을 한다.
  • Execution Engine
    • Excution Engine 은 Class Loader에 의해 메모리에 적재된 클래스(바이트 코드)들을 기계어로 변경해 명령어 단위(Operation Code)로 실행하는 것을 말한다. 명령어 단위 실행에는 2가지 방식이 있다.

     

 

  • Garbage Collector
    • Garbage Collector (GC) 는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 제거하는 역할을 한다. GC의 동작시간은 일정하게 정해져 있지 않기 때문에 언제 객체를 정리할지는 알 수 없다. 즉 바로 참조가 없어지자마자 작동하는것이 아니라는 것이다. 또한, GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 된다. 특히 Full GC가 일어나서 수초간 모든 Thread 가 정지한다면 심각한 장애로 이어질 수 있다.
  • Runtime Data Area
    • JVM 의 메모리 영역으로 자바 애플리케이션 실행시 사용되는 데이터를 적재하는 영역이다. 크게 5가지 영역으로 구분된다.

     

  1. Method Area 
    • 필드 정보 (클래스 멤버 변수명, 데이터 타입, 접근 제어자 정보) 
    • 메소드 정보( 메소드 명, 리턴 타입, 접근 제어자 정보)
    • Type 정보 ( Interface 인지 class 인지 )
    • Constant Pool ( 상수 풀 : 문자 상수, 타입, 필드, 객체 참조 저장 )
    • Static 변수
    • Final 클래스 변수
  2. Heap Area
    • new 키워드로 생성된 객체와 배열이 생성되는 영역
    • Method Area에 로드된 class 만 생성 가능하며 GC가 참조되지 않은 메모리를 확인하고 제거하는 영역
  3. Stack Area
    • 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시값 등을 저장
    • int a = 10 을 예로 들면 정수값이 할당될 수 있는 메모리 공간을 a라고 잡아두고 그 메모리 영역에 10을 넣는다. 클래스 A a = new A();의 경우 A a는 스택영역에 저장되고 new로 생성된 A클래스의 인스턴스는 Heap영역에 생성된다. 또한 스택영역에 생성된 a는 Heap 영역의 주소값을 가지고 있다. 즉 a가 heap 영역에 생성된 객체를 가리키며 참조하고 있다. 메소드 호출시 마다 개별적으로 스택이 생성된다.
  4. PC Register
    • Thread 가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해 Thread 를 돌아가면서 수행한다. 
  5. Native Method Stack
    • 자바외 언어로 작성된 네이비트 코드를 위한 메모리 영역이다. 보통 C/ C++ 등의 코드를 수행하기 위한 스택이다.

Thread 생성시 Method, Heap 영역을 모든 스레드가 공유하고, stack, PC Register, Native Method Stack 은 각각의 스레드마다 생성되고 공유되지 않는다.