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

koyo·2020년 11월 24일
0

Java

목록 보기
1/2
post-thumbnail

목표

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

학습할 것

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

JVM이란 무엇인가

JVM(Java Virtual Machine)은 자바를 실행시켜주는 머신이다.
JVM은 크게 클래스 로더 시스템, 메모리(런타임 데이터 영역, 실행엔진)으로 나뉜다.
JVM은 OS에 의존적이며, Java는 OS에 독립적이도록 도와준다.

컴파일 하는 방법

컴파일을 한다는 것은 .java 파일을 .class파일(바이트코드)을 만든다는 것을 의미한다.
JDK내 bin 폴더 안에 javac라는 java compiler를 활용한다.

javac Hello.java

추가) javac의 옵션을 알아보자

실행하는 방법

.class파일을 JVM을 활용해 실행하는 것을 말한다.

java Hello.class

바이트코드란 무엇인가

  • 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
  • 대부분의 명령 집합이 1바이트 크기의 명령코드였기 때문에 바이트코드라고 불리게 된 것이다.
  • Java 관점에서 보았을 때, JVM이 이해할 수 있는 형태의 코드가 바이트코드이다.

JIT(Just In Time) 컴파일러란 무엇이며 어떻게 동작하는지

  • 인터프리터 + 정적 컴파일
  • 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지하는 역할

JVM 구성 요소


사진출처 : 더 자바, 코드를 조작하는 다양한 방법

클래스 로더 시스템

  • 클래스 파일에서 바이트코드를 읽고 메모리에 저장한다.
  • 다음의 행위를 순서대로 진행한다.
    • 로딩 : 클래스를 읽어오는 과정
    • 링크 : 레퍼런스를 연결하는 과정
    • 초기화 : static 값들 초기화 및 변수에 할당

메모리(런타임 데이터 영역)

  • 메소드 : 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수)가 저장되며, 공유 자원이다.
  • 힙 : 객체를 저장하며, 공유 자원이다.
  • 스택 : 쓰레드마다 런타임 스택을 만들고, 그 안에 메소드 호출을 스택프레임이라 부르는 블럭으로 쌓는다. 쓰레드 종료하면 런타임 스택도 사라진다.
  • PC 레지스터 : 쓰레드마다 쓰레드 내 현재 실행할 명령을 가리키는 포인터가 생성된다.
  • 네이티브 메소드 스택 : 자바 이외의 언어(C, C++, 어셈블리 등)로 작성된 코드를 실행할 때 할당되는 스택

실행 엔진

  • 인터프리터 : 바이트코드를 한줄 씩 실행
  • JIT 컴파일러 : 인터프리터와 함께 쓰레드 내에서 동작하며 인터프리터가 읽은 부분 중 자주 쓰이는 것을 기계어로 캐싱하여 그것을 들고와서 쓴다.
  • GC : 더 이상 참조되지 않는 객체를 모아서 정리한다.

JNI(Java Native Interface)
실행되고 있는 자바코드가 네이티브 응용 프로그램(하드웨어와 운영체제 플랫폼에 종속된 프로그램) 그리고 C, C++ 그리고 어셈블리 같은 다른 언어로들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크이다.

네이티브 메소드 라이브러리
C, C++로 작성된 라이브러리

JDK와 JRE의 차이

사진출처 : 더 자바, 코드를 조작하는 다양한 방법

JDK(Java Development Kit) : 자바 개발 도구
JRE(Java Runtime Environment : 자바 실행 환경

즉, 자바 언어로 프로그램을 개발하기 위해서는 JDK가 필요하며 작성된 프로그램을 실행하기 위해서는 JRE가 필요하다.

참고로 java compiler는 개발에 필요한 것이므로 JDK내에 포함된다.

Java 9부터는 JDK만 배포하고 있다.

profile
클라우드 개발자가 될 코요입니다.

0개의 댓글