Java/STUDY HALLE

[Java]JVM 기술 스택의 구조 이해하기

무토(MUTO) 2020. 11. 14. 11:04

1주차. 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

 

 

"WHY?"

왜 우리는 자바 소스파일이 JVM 위에서 실행되는 과정을 알아야 할까? 

 

 

"자바는 블루칼라 언어입니다. 박사 학위 논문 주제가 아니라 일을 하려고 만든 언어죠."

-제임스 고슬링

 

 

  자바는 지극히 실용적인 언어이다. 개발환경이 충분히 빠르다면 개발자의 생산성이 높아지는 대가로 어느정도의 성능 희생은 감수할 수 있다는 것이다. 애초에 처음부터 자바는 개발자가 플랫폼을 저수준에서 다 알 필요가 없도록 설계되었다. 그래서 제대로 된 Java 개발자라면 기본적인 JVM 기술스택의 구조를 이해해야 한다. 생산성을 위해 어느정도의 성능을 희생했는지, 필요로 하는 만큼의 성능을 향상 시키기 위해서 다른 언어를 선택하는 것이 더 좋을지 아니면 JVM 내부에서 튜닝을 진행하는것이 더 좋을지와 같은 개발과정에서 마주하는 문제에 대한 답을 내릴수 있어야 하기 때문이다. 결국 JVM을 이해해야만 더 좋은 소프트웨어를 개발할 수 있고, 개발하는데 필요한 이론적 배경지식을 갖출 수 있다.

 

  왜 우리가 JVM 에 대해서 공부해야 하는가는 밝혔으니 본격적으로 세부 사항들에 대해서 파악해보도록 하자.

 

 

 

1. JVM이란 무엇인가?

 

오라클 홈페이지에서 바로 간단하게 찾아볼 수 있는 jvm 스펙 문서이다. 홈페이지에서는 위의 사진과 같이 jvm에 대해서 설명하였고 내 나름대로 해석을 해보자면 jvm은 다음과 같다.

 

1) jvm은 컴퓨터를 추상화한 머신이다. 물리적 하드웨어와 같은 레지스터는 없지만 컴퓨터가 돌아가는 방식과 같이 일부 결과를 실행스택에 보관하고 그 값들을 가져와 계산한다.

 

2) jvm은 java를 모른다. 특정 바이너리 형식인 class 파일의 형식만 알 수 있다.

 

즉, 컴퓨터가 C 코드를 컴파일된 기계어로 작업을 수행하는것과 같이, jvm은 컴파일된 class 파일을 해석하여 작업을 수행한다.

 

JVM은 class 파일을 기반으로 명령어를 해석하는 추상적 실행머신이다.

 

 

 

 

2. JVM의 구성요소

 

Class Loader

 

:자바 컴파일러가 생성한 클래스파일들을 모아서 Runtime Data Area 형태로 메모리에 쌓는다.

 

 

 

Execution Engine

 

:메모리에 쌓여진 클래스들을 기계어로 변경해 명령어 단위로 실행한다.

 

 

 

Garbage Collector

 

:Heap 영역에 생성된 객체중에 연결고리를 잃은 객체를 찾아 제거한다.

 

 

 

Method Area

 

:클래스 멤버변수, 메소드 정보, Type, Constant Poll, static 및 final 변수등을 저장한다.

 

 

 

Heap Area

 

:동적으로 생성된 객체와 배열이 저장된다.

 

 

 

Stack Area

 

:지역변수, 파라미터, 객체의 레퍼런스가 저장된다.

 

 

 

PC Register

 

:현재 쓰레드의 주소와 명령을 저장한다.

 

 

 

Native Method Stack

 

:자바 외의 언어로 작성된 코드들이 저장된다.

 

 

 

3.Java 코드를 실행하는 방법

 

jdk를 설치 후 환경변수 설정을 마친 후에 java -help를 치면 Java를 실행하는 방법과 모든 옵션에 대한 설명이 나온다.

 

그러나 일반적으로 java (파일 이름.java)를 입력하면 자바 파일이 실행된다. 

 

 

 

4.Java 코드를 컴파일하는 방법

 

위와 비슷하게 javac -help 를 입력하면 java컴파일을 하는 방법과 모든 옵션에 대한 설명이 나온다.

 

그러나 일반적으로 javac (파일 이름.java) 를 입력하면 java 파일이 class 파일로 컴파일 된다.

 

 

 

 

5. 바이트코드란 무엇인가?

 

바이트코드는 VM에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.

자바에서는 java소스를 컴파일하면 해당 이름을 가진 class 파일에 바이트코드를 저장한다. 그렇게 적힌 바이트코드를 보고싶다면 javap 라는 jdk에 내장되어있는 역어셈블러를 사용하면 볼 수 있다.

 

 

 

 

6. JIT 컴파일러란 무엇이며 어떻게 동작하는가?

 

Java 프로그램은 CPU를 추상화한 구조라서 다른 플랫폼에서도 클래스 파일을 문제없이 실행할 수 있지만, 프로그램 성능을 최대로 내려면 네이티브 기능을 활용해 CPU에서 직접 프로그램을 실행시켜야 한다.

 

이를 위해 JVM은 필요에 따라 프로그램 단위를 느린 인터프리티드 바이트코드에서 빠른 네이티브 코드로 컴파일한다. 이것이 JIT 컴파일이다.

 

JVM은 인터프리터 모드로 실행하는 동안 애플리케이션을 모니터링 하면서 가장 자주 실행하는 코드 파트를 발견해 JIT컴파일을 수행한다. 이렇게 분석을 하는 동안 미리 프로그래밍한 추적 정보가 취합되면서 더 정교하게 최적화를 할 수 있다. 특정 메서드가 어느 한계치를 넘어가면 프로파일러가 특정 코드 섹션을 컴파일/최적화 한다.

 

 

 

 

7. JDK와 JRE의 차이

 

JDK

:Java 기반 응용 프로그램을 개발하는데 사용할 수 있는 소프트웨어 번들

 

JRE

:Java 프로그램을 실행하는 Java Virtual Machine의 구현체, Java 프로그램을 실행하는데에 필요한 플러그인

 

 

 

 

위에 적힌 내용들 모두 JVM 스펙을 적어놓은 사이트에 들어가서 확인해보면 더욱 자세한 내용을 파악할 수 있다. 내용을 최대한 한줄로 요약 하기 위해서 최소한으로 글을 적어 놓았으나 직접 시간 날 때 사이트를 확인하여 JVM에 대해서 파악할 수 있으면 좋겠다.


https://docs.oracle.com/javase/specs/jvms/se15/html/

'Java > STUDY HALLE' 카테고리의 다른 글

[Java] GitHub Library 사용법  (0) 2020.12.06
[Java] JUnit5  (0) 2020.12.05
[Java] 제어문  (0) 2020.12.05
[Java] 연산자  (1) 2020.11.27
[Java] 데이터타입, 변수, 배열  (0) 2020.11.21