Java

JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

jwKim96 2020. 12. 16. 00:20

목차

  1. JVM이란 무엇인가

  2. 컴파일 & 실행하는 방법

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

  4. JIT 컴파일러란 무엇이며 어떻게 동작하는지

  5. JVM 구성 요소

  6. JDK와 JRE의 차이

 

 

1. JVM이란 무엇인가

JVM이란 무엇인지 알아보기 전에, JVM이 필요한 이유를 생각해보았다.

왜 JVM이 필요했나요?

1990년대 Sun Microsystems의 'Green Team'은 개개인의 물건에 컴퓨터가 있는 시대를 예감하였습니다.

그래서 냉장고, TV 등과 같은 여러 기기, 플랫폼(OS+CPU아키텍처)에서 동작할 수 있는 언어가 필요하였고,

이는 WORA(Write Once, Run Anywhere)라는 자바의 철학이 만들어지게된 계기였습니다.

이것이 JVM이 필요했던, 탄생했던 이유입니다.

 

그래서 JVM이 뭔가요?

그래서 JVM이란, 플랫폼의 종류에 영향받지 않고 Java Source Code가 동작할 수 있는 가상 환경을 말합니다.

덕분에 우리는 JVM이 설치된 환경이라면 다시 컴파일 하는 수고 없이, Windows10에서 작성한 Java파일을

Ubuntu(Linux)에서 실행할 수 있고, Ubuntu에서 실행중이던 프로젝트를 CentOS로 옮겨 실행할 수 있게 되었습니다.

 

 

2. 컴파일 & 실행 하는 방법

Java는 어떻게 컴파일을하고, 어떻게 실행하나요?

Sample.java 파일이 있는데, 이제부터 이 파일을 컴파일&실행 과정을 살펴봅시다.

C:\경로에 Sample.java 파일이 있다.

public class Sample {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

 

[Compile Time]

javac명령어를 통해 Sample.class라는 바이트코드가 생성됨

먼저 javac(Java Compiler)는 우리가 작성한 Sample.java 파일을 Java Bytecode(Sample.class)로 변환합니다.

 

[Runtime]

우리가 java명령어를 통해 Sample.class를 실행하면 Class Loader가 동작합니다.

Class Loader가 class를 읽어오고 Execution영역에서 이를 해석하여 Instance를 생성하고

JVM의 Runtime Data Area의 Heap에 적재합니다.

(아래 Excution 영역에는 Interpreter와 JIT compiler가 있는데 이 둘의 차이는 4번에서 알아보겠습니다.)

 

https://rosebud90.tistory.com/entry/자바의-신-부록-역사와-JVM

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

Java Compiler가 만든 바이트코드란 무엇인가요?

플랫폼에 따른 차이없이 동일한 형태로 변환되는 코드입니다.

기계어에 조금 더 가까운 형태로 변환되며, Execution 영역에서

Compile(Interpret)하기 쉬운 형태로 변환된 코드입니다.

그럼 어차피 동일한 형태로 변환할거면, 왜 JVM에서 안하나요?

그 이유는, JVM에서 실행되는 속도를 더 높이기 위함입니다!

실제로 Java개발을 할때 Build(Java Compile)플랫폼과 Runtime플랫폼이 다른경우가 많습니다.

만약 java파일을 Runtime에서 사용하게되면, 자연어를 기계어로 변환하는것은 시간과 메모리를

상대적으로 많이 소모하는 작업이기 때문에, 자연어(java)보다 기계어에 조금 더 가까운 형태인

class형태로 변환하여 JVM에 올리게 됩니다.

 

4. JIT컴파일러란 무엇이며 어떻게 동작하는지

2번의 사진을 보니 Execution영역에 Interpreter와 JIT Compiler는 어떤역할을 하나요?

일단, JVM이 class를 실행할때, Bytecode를 기계어로 Compile하는 역할이 필요한데 이 역할을 JIT Compiler가

수행합니다. 

이 뿐만 아니라, JIT Compiler는 같은 코드를 매번 해석하지 않고, Compile하면서 해당 코드를 캐싱해버립니다!

그러면 바뀌는 부분이 있다면, JIT Compiler는 바뀐 부분만 Compile하고, 나머지는 캐싱된 코드를 그대로

사용하여 Compile속도를 개선합니다.

이렇게 Compile된 코드는 Interpreter가 실제로 실행하게 됩니다.

5. JVM 구성 요소

JVM은 어떤 구조로 이루어져있나요?

https://rosebud90.tistory.com/entry/자바의-신-부록-역사와-JVM

  • Execution Engine
    Byte Code를 실행할 수 있도록 Compile해주는 JIT Compiler와 이를 실행하는 Interpreter가 있습니다.
  • Runtime Data Area
    • Heap : new Sample(); 을 통해 생성된 Instance가 저장되는 구역(모든 Thread가 공유)
      • Garbage Collertor(GC) : 사용되지 않는 Instance가 차지하고있는 메모리영역(생명주기가 짧은 Instance)
        을 해제하여 사용할 수 있는 형태로 만듦 
    • Stack : Method 
    • Method : 클래스, 변수, 메소드, static 변수, 상수 등이 저장되는 구역(모든 Thread가 공유)
    • PC Register : 

https://12bme.tistory.com/382

6. JDK와 JRE의 차이

ㅇㅇ

 

http://magic.wickedmiso.com/183

 

 

참조

  • https://youtu.be/UzaGOXKVhwU - [10분 테코톡] 🎅무민의 JVM Stack & Heap
  • https://magic.wickedmiso.com/183 - [JAVA] Java의 역사와 JVM, 알아두어야 하는 상식
  • https://asfirstalways.tistory.com/158 - #자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?
  • https://rosebud90.tistory.com/entry/자바의-신-부록-역사와-JVM - [자바의 의 신 부록] 자바의 역사와 JVM 
  • https://ttuk-ttak.tistory.com/38 - [Java]자바 컴파일 과정