백기선 과제

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

PAIK'S JAVA 2021. 1. 30. 17:22
반응형

▶ 학습목표 : 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

 

▶ 학습할 것 

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

 

① JVM이란 ? 

Java Virtual Machine 의 약자이며, 한글로는 '자바 가상 기계' 로서 바이트코드를 실행시켜 주는 주체이다.

원래는 OS마다 다른 [컴파일러]가 필요하지만 JAVA는 JVM이 바이트코드(0,1)를 OS에 맞게 번역해준다.

   

1. 자바 소스코드 부터 컴퓨터 출력까지의 과정 (출처 : 생활코딩) 

위 1번 사진을 참고하여 이해해보자.

 

② 컴파일(Compile) 하는 방법

첫째로 이클립스에서 Hello World! 라는 문구를 출력하려고 한다.

package baekjoon;

public class baekjoon_2557 { // Hello World!
	
	public static void main(String[] args) {
		
		System.out.println("Hello World!");
		
	}
	
}

④ 바이트코드란 무엇인가?

이렇게 작성한 것이 자바 소스 코드(.java) 이며 이것은 단순히 인간이 작업하기 위한 코드일 뿐 컴퓨터에선 읽지 못한다.

컴퓨터는 바이트코드인 (.class)파일을 읽을 수 있는데, [ctrl] + [F11]을 눌러 실행하면 아래 사진처럼 자동 생성된다.

이 과정을 [컴파일 Compile]이라 한다.

.class 파일

③ 실행하는 방법

이렇게 컴파일된 .class파일을 JVM에서 읽어들여 컴퓨터가 동작하게 되는 구조이다. 

출력된 Hello World! 콘솔창

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

-interpreter : 자바 바이트 코드를 한줄 씩 실행, 여러 번 실행하는 환경에서는 속도가 다소 느림

-JIT : Just In Time의 약자로서 한번 실행할 때 해당 코드를 캐싱하여 이후엔 바뀐 부분만 컴파일하여 interpreter보다 빠르게 수행가능

JIT 동작 방식

⑥ JVM의 구성 요소와 흐름도

대구분

설명

클래스 로더

JVM이 수행할 클래스를 찾아서 클래스의 바이너리 데이터를 메모리에 적재, 이때 클래스를 검증(Verification), 클래스 변수를 위한 메모리를 초기화해서 기본 값으로 할당(Preparation), 클래스의 참조를 직접 참조로 변환(Resolution)한다.

즉, 클래스 파일을 실행할 준비단계라고 생각하면 된다.

실행시간

데이터

영역

클래스 로더에서 준비해서 여기서 이제 수행하면서 쓸 데이터들을 보관한다.

보관소는 5개이다.

메소드 영역

프로그램이 수행되는 동안 클래스의 정보를 참조하는 곳 저장되는 것은 호딩된 클래스의 정보, 멤버변수 정보, 메소드 정보, 스태틱 변수(클래스 변수) 등이 저장됨

힙 영역

프로그램 상에서 데이터를 저장하기 동적으로(실행시간에) 할당하여 쓸 수 있는 메모리 영역

자바 프로그램은 프로그램 실행 중 new 연산자를 사용하여 객체를 동적으로 생성 이러한 객체나 배열을 저장한다.

이 영역도 유일한 공간이므로 여러 스레드가 공유한다

더더욱 이 영역은 메모리 해제를 할 수 없다.

오로지 GC만이 해제가 가능하다.

즉, GC가 메모리를 정리하는 힙영역이다.

스택 영역

메소드가 호출될 때마다 스택 프레임이라는 데이터 영역이 생성되며, 이것이 쌓여 스택을 구성한다.

수행되는 메소드 정보, 로컬변수, 매개변수, 연산 중 발생하는 임시데이터 등이 저장된다.

위와 같은 변수들은 해당 메소드가 수행되는 동안 필요로 되며 메소드의 수행이 끝나면 필요 없게 된다. 즉 메소드가 호출될 때 필요로 되는 변수들을 스택에 저장하고 메소드 실행이 끝나면 스택을 반환한다.

JVM은 이러한 스택 영역을 실행 중인 프로그램(스레드)에 따라 각각 구성하게 된다.

LIFO(Last In First Out) 각 메소드를 위한 메모리상의 작업공간은 서로 구별되며(프레임), 언제나 호출스택의 제일 위에 있는 메소드가 현재 실행 중인 메소드 아래에 있는 메소드가 바로 위의 메소드를 호출한 메소드가 된다.

Native

메소드 스택

자바 언어가 아닌 기존의 다른 언어에서 제공되는 메소드를 의미

다른 언어 메소드의 매개변수, 지역변수 등을 저장한다.

PC 레지스터

스레드가 시작할 때 생성되어 JVM이 현재 수행할 명령어의 주소를 저장

실행엔진

적재된 클래스의 메소드 내의 명령, 즉 바이트 코드를 인터프리트하여 수행한다.

 

JVM 흐름도

 

⑦ JDK와 JRE의 차이

JRE : Java Runtime Environment의 약자로서 JVM + 여러 자바 프로그램 실행에 필요한 라이브러리 파일을 포함한다.

JDK : Java Development Kit의 약자로서 JRE + 개발에 필요한 도구를 포함(컴파일러, 디버그등 )

             JVM < JRE < JDK 순서의 포함관계              (출처 : 공부하는 개발자 유튜브)

요약하자면 JDK를 설치하면 JRE와 JVM도 같이 설치되므로 JAVA의 버전 = JDK의 버전이 된다