Live-Study

[1주차] JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가

youn12 2020. 11. 20. 17:47
✏️ Info.

 - JVM 기본 정리
 - JAVA 사용법

📋 List.

1. JVM 이란 무엇인가
2. 컴파일하는 방법
3. 실행하는 방법
4. 바이트 코드란
5. JIT 컴파일러 란, 동작 원리
6. JVM 구성 요소
7. JDK와 JRE 차이

✔️ Content.

 

1. JVM이란 무엇인가

  • Java Byte Code를 OS에 맞게 해석해주어 컴퓨터가 실행시킬 수 있게 하는 주체이다.
  1. source code를 작성한다 -> .java 파일 생성
  2. .java 파일을 컴파일(javac) 한다. -> .class 파일 생성
  3. .class 파일을 OS가 읽을 수 있게 기계어로 변환 시켜준다 -> JVM

JVM 이란


2. 컴파일 하는 방법(Java가 설치 되있음을 가정하에 진행)

 

1). Java Source Code 작성 -> TestClass.java 파일 생성

 

public static void main(String[] args) throws Exception{		
	System.out.println("컴파일 하는 방법");
}

 

2). .java 파일 위치에서 Javac TestClass.java 명령어 입력 -> TestClass.class 파일 생성

 

javac .\TestClass.java

 

Compile 결과


3. 실행하는 방법

 

  • java [파일명] 명령어 입력(확장자는 입력하지 않는다)
java TestClass

4. 바이트코드란 무엇인가

 

  • 1바이트 크기의 명령 코드 였기에 바이트코드라 불린다.
  • 기계어보다 더 추상적인 언어로 위의 Javac로부터 얻어지는 .class파일이다.
  • JVM에 의해서 실행되어지는 코드이다.

5. JIT 컴파일러 란, 동작 원리

 

 1). JIT 컴파일러란

 

  • Just In Time 
  • JRE에 포함되어 잇다.
  • 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법

출처 : https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45

 2). 동작 원리

 

  • 같은 코드를 매번 해석하지 않고 실행 할 때 컴파일을 하며 코드를 캐싱한다.
  • 이후 바뀐 부분만 컴파일을 하며 나머지는 캐싱된 코드를 가져와 사용한다.

6. JVM 구성 요소

출처 : https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0

 

  • 크게 Class Loader, Runtime Data Areas, Execution Engine 3가지 영역으로 나뉜다.

 

1). Class Loader

  • .java 파일을 컴파일해서 만든 .class인 파일들을 엮어 Runtime Data Area에 적재하여 프로그램을 구동한다.
  • Runtime 시에 일어나는데 클래스에 처음 접근될 때 일어나게 된다.

 

2). Execution Engine

  • Class Loader가 Runtime Data Areas에 불러온 바이트 코드를 실행하는 역할.
  • 바이트코드를 실행할 때 기계어로 변경해 명령어 단위로 실행한다.
  • 명령어를 하나 씩 실행하는 인터프리터(Interpreter) 방식과 자주 쓰이는 코드를 캐싱해놓고 실행 시점에 사용하는 JIT 방식이 있다.

 

3). Runtime Data Areas

 

  • OS로부터 할당받은 JVM메모리 영역이다. JAVA App를 실행하는데 필요한 데이터를 담는다.
  • Method Area
    • 모든 Thread가 공유하는 메모리 영역
    • 클래스, 인터페이스 ,메소드 ,필드, Static, Final 등의 ByteCode 등을 보관한다. 
  • Heap Area
    • 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역
    • class를 이용해 instance를 생성하면 Heap에 저장(new Class())
    • Garbage Collection의 대상이 되는 영역이다.
  • Stack Area
    • Thread마다 별개의 Frame으로 저장된다. - JNI 를 이용해 JVM 내부에 영향을 주지 않기 위함
  • PC Register
    • Thread가 시작 될 때 생성되며 Thread마다 하나씩 존재
    • Thread가 현재 실행하고 있는 부분의 주소를 저장한다.
    • OS는 PC Register를 참고하여 CPU 스케줄링 시 해당 Thread가 다음에 어떠한 명령어를 수행해야하는지 알 수 있다.
  • Native Method Stack
    • Java 외의 언어로 작성된 Native 코드들(C, C++ 등)을 위한 Stack

7. JDK와 JRE의 차이

  • JDK
    • Java Development Kit
    • Java 기반 응용 프로그램을 개발하는데 사용할 수 있는 소프트웨어 번들
    • JRE + 개발/디버깅 툴
  • JRE
    • Java RunTime Enviroment
    • Java 프로그램을 실행하는데 필요한 플러그인
    • 컴파일된 자바 프로그램을 실행 시킬 수 있는 환경
    • JVM + Java 패키지 클래스 + 런타임 라이브러리

❗️ Refer.

- 바이트 코드란 무엇인가 - https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

 - JIT 컴파일러란 무엇이며 어떻게 동작하는지 - https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45

 - JVM 구성 요소
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
https://velog.io/@litien/JVM-%EA%B5%AC%EC%A1%B0
https://lazymankook.tistory.com/79

- JDK와 JRE의 차이
https://c10106.tistory.com/3135

 

'Live-Study' 카테고리의 다른 글

[6주차] 상속  (0) 2021.02.19
[5주차] 클래스  (0) 2021.01.04
[4주차] 제어문  (0) 2020.12.31
[3주차] 연산자  (0) 2020.11.23
[2주차] 자바 데이터 타입, 변수 그리고 배열  (0) 2020.11.20