Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
관리 메뉴

성빈

[JAVA] 1주차 JVM 본문

JAVA

[JAVA] 1주차 JVM

성빈나 2023. 7. 17. 19:38

목표

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

학습할 것

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

1. JVM이란 무엇인가

JVM(Java Virtual Machine)은 자바 가상 머신으로, 자바 프로그램 실행환경을 만들어 주는 소프트웨어 이다.

이는 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공한다. (즉, 어떠한 플랫폼에 영향을 받지 않는다.)

 

● C언어

 

                             (출처 : [[Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리 (tistory.com)](<https://coding-factory.tistory.com/827>) )

 

윈도우 실행파일은 윈도우 컴파일러로 컴파일되었기에 Test.exe는 윈도우에서만 실행되며, 리눅스 운영체제에서는 실행할 수 없다. 즉 C / C++에서는 컴파일 플랫폼과 다를 경우에는 프로그램이 동작하지 않는다.

 

● JAVA

                             (출처 : [[Java] 자바 가상머신 JVM(Java Virtual Machine) 총정리 (tistory.com)](<https://coding-factory.tistory.com/827>) )

자바 컴파일러에 의해 생성된 Test.class 바이트 코드는 각자의 플랫폼에 설치되어 있는 JVM이 운영체제에 맞는 실행 파일로 바꿔준다. 즉 Java에서는 C언어와는 달리 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 따로따로 해줘야 할 필요가 없다. 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.

 

2. 컴파일 하는 방법

자바 컴파일러에 의해 .java 파일을 .class 라는 자바 바이트 코드로 만든다.

3. 실행하는 방법

.class 파일이 위치한 곳으로 이동 후 java <.class 파일 이름> 을 입력해 실행시킨다.

4. 바이트 코드

바이트 코드는 자바 가상 기계에서만 실행되는 기계어로서, 어떤 CPU와도 관계없는 바이너리 코드이다.

자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1byte라서 바이트 코드라고 불리고 있다.

확장자는 .class이고, JVM만 설치되어 있으면 어떤 운영체제에서든 실행될 수 있다.

5. JIT 컴파일러

 

○ JIT(Just In Time) 컴파일러

 

자바는 자바 가상 기계가 인터프리터 방식으로 바이트 코드를 실행하므로 일반적으로 C/C++로 작성된 프로그램보다 실행이 느리다고 알려져 있지만, 최근에는 실행하는 도중 자바 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행하도록 하는 JIT 컴파일링 기법을 이용하므로, 실행 성능이 C/C++와 거의 비슷하도록 개선되었다.

 

○ 실행방식

 

이렇듯 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱한다. 이후에는 바뀐 부분만 컴파일하고, 나머지는 캐싱된 코드를 사용한다.

 

6. JVM 구성요소   

(출처: Java - JVM 구성 요소와 역할 정리! (+ JIT 컴파일러, 인터프리터, 클래스 로더, 가비지 컬렉터란 무엇인가?) (tistory.com) )

 

JVM은 아래와 같이 구성된다.

  1. 클래스 로더(Class Loader)
  2. 실행 엔진(Execution Engine)
    ● 인터프리터(Interpreter)
    ● JIT 컴파일러(Just-in-Time compiler)
    ● 가비지 콜렉터(Garbage collector, GC)
  3. 런타임 데이터 영역 (Runtime Data Area)

 

(1) 클래스 로더 (Class Loader)

: 한 번에 메모리에 모든 클래스를 로드하는 것이 아닌, 필요한 순간에 해당 클래스(.class) 파일을 찾아 메모리에 로딩해주는 역할을 한다.

 

(2) 실행엔진 (Execution Engine)

: Class Loader에 의해 메모리에 Load된  .class 파일을 기계어로 변경해 명령어 단위로 실행하는 역할을 한다.

 

● 인터프리터 (Interpreter)

   - 자바 컴파일러에 의해 변환된 바이트 코드를 읽고 한 줄씩 기계어로 해석한다.

 

● JIT 컴파일러 (Just-in-Time compiler)

   - 속도가 느리다는 인터프리터 방식의 단점을 보완하기 위해 도입되었다.

   - 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고,

   - 해당 메소드가 여러 번 호출할 때 매번 해석하는 것을 방지한다.

 

● 가비지 콜렉터 (Garbage collector, GC)

   - 더이상 참조되지 않는 Heap 영역의 메모리를 정리해준다.

 

(3) 런타임 데이터 영역 (Runtime Data Area)

: JVM의 메모리 영역으로, 자바 어플리케이션을 실행할 때 사용되는 데이터를 로드하는 영역이다.

 

(출처 :&nbsp; https://javapapers.com/core-java/java-jvm-run-time-data-areas/#Program_Counter_PC_Register )

 

   - Heap, Method 영역 : 모든 스레드들이 서로 공유한다.

   - Stack, PC, Native Method 영역 : 스레드마다 생성되어 저장된 정보를 서로 공유하지 않는다.

 

 

더보기

※ Heap, Method, Stack, PC, Native Method 영역 추가 설명

(출처 :&nbsp; https://medium.com/@lazysoul/jvm-이란-c142b01571f2 )

 

7. JDK와 JRE

 

(출처 : ☕ JDK / JRE / JVM 개념 & 구성 원리 💯 총정리 (tistory.com) )

 

● JRE (Java Runtime Environment)

 

JRE는 자바 실행 환경으로, 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 JVM이 포함되어 있다. JRE는 자바로 “개발(쓰기)은 안되고 실행(읽기)만 된다”고 할 수 있다.

 

● JDK (Java Development Kit)

 

JDK는 자바 개발키트로, 개발자들이 자바로 개발하는 데 사용된다. JDK안에는 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE도 함께 포함되어 있다.

 

'JAVA' 카테고리의 다른 글

[JAVA] 3주차 연산자  (0) 2023.10.27
[JAVA] 2주차 자바 데이터타입, 변수, 배열  (0) 2023.07.24