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

dragonappear·2021년 3월 7일
0

Java

목록 보기
1/22

목표

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

학습할 것

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

JVM이란 무엇인가:

자바 프로그램에선 JVM을 사용하여 프로그램을 실행시킨다.
일반적인 프로그램들은 Windows,Linux,Mac과 같은 OS 위에서 실행된다.
하지만 자바 프로그램들은 OS 위의 JVM에서 실행된다.
굳이 JVM 위에서 자바 프로그램을 실행하는 이유는 자바 프로그램을 os에 상관없이 실행시키기 위함이다.
예를 들어 윈도우의 워드 프로그램은 리눅스에서 동작하지 않는다.
따라서 자바 프로그램은 어떤 OS에서도 그에 맞는 JVM을 통해 자바 프로그램을 실행시킬수있다.

JVM의 역할:

자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행한다.
JVM은 자바와 OS 사이에서 중개자 역할을 수행하여, 자바가 OS에 구애받지 않고 재사용을 가능하게 해준다.
메모리 관리, garbage collection(더이상 사용되지 않는 메모리 회수)을 수행해준다.


컴파일 하는 방법:

컴파일 이란? 컴파일러가 인간이 프로그래밍 언어로 작성한 코드를 기계가 알아들을수있도록 다른 언어로 옮기는 작업
자바의 경우에는 코드가 바이트코드로 컴파일된다.
javac 클래스명.java를 실행하면 클래스 파일(.class)이 생성된다.
javac 주요옵션:

출처:링크텍스트

실행하는 방법:

클래스 파일을 인터프리터(실행엔진의 역할을 수행하여, 바이트코드를 명령어 단위로 읽어서 실행한다)를 통해 JVM에 실행시킨다.
java 클래스파일명 을 실행하면 자바 프로그램이 실행된다.

자바 프로그램 실행과정:

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받고 이 메모리를 용도에 맞게 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)을 읽어들여 자바 바이트코드(.class)로 변환시킨다.
  3. 클래스 로더를 통해 class파일들을 JVM으로 로딩한다.
  4. 로딩된 class파일들은 execution engine(인터프리터,JIT)을 통해 해석된다.
  5. 해석된 바이트코드(.class)는 runtime data areas(프로그램을 수행하기 위해 os에서 할당받는 메모리 영역)에 배치되고 수행이 이루어진다. 이러한 과정속에서 jvm은 필요에 따라 garbage collection 같은 관리작업을 수행한다.


출처:링크텍스트


바이트코드란 무엇인가:

바이트코드는 고급 언어로 작성된 소스코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.
가상머신은 이 바이트코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일한다.
바이트코드의 단위는 명령어이고, 명령어의 크기는 1byte이다.
OS에 맞는 JVM이 설치되어 있다면 바이트 코드는 어떠한 OS에서도 실행될수 있습니다.


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

JIT(Just In time Compiler): 자바 프로그램을 실행할때, 인터프리터가 line by line으로 기계어로 번역하는데, 코드중에 반복되거나 자주 실행되는 코드가 있으면 JIT 컴파일러가 그 코드를 기계어로 변환한 다음 JDK 내부에 caching 해놓고 재사용한다.


JVM 구성 요소:


출처:링크텍스트

JVM은 크게 4가지 구성요소를 가진다.

  1. Class loader
  2. Garbage Collector
  3. Excution engine
  4. Runtime Data area

1. Class Loader

  • JRE의 일부로, 바이트코드를 실행할때 class객체를 메모리에 생성하는 요소이다.
  • 클래스의 인스턴스를 생성하면 Class Loader를 통해 메모리에 로드한다.

2. GC(garbage Collector)

  • 자바는 메모리 관리를 사용자가 아닌 JVM이 알아서 해준다.
  • GC는 더이상 참조되지 않는 메모리를 정리해준다.
  • GC는 언제 호출되는지는 알 수 없으며, 심지어 사용자가 호출하더라도 메모리 정리할 필요가 없다고 판단하면 실행하지 않는다.

3. Execution Engine

  • 메모리에 로드된 바이트코드를 실행하는 역할을 한다.
  • Class Loader를 통해 Runtime Data Area에 배치된 바이트코드는 Executution Engine에 의해 실행된다.
  • 인터프리터 방식이나 JIT 방식으로 실행한다.

4. Runtime Data Area

  • JVM의 메모리 영역이다
  • 크게 네가지 영역으로 구분할수있다.
    1. 클래스 영역: 실행에 필요한 클래스들을 로드하여 저장한다. 내부에서 메서드영역과 상수영역으로 또 나뉘어 저장된다.
    2. 가비지 컬렉션 힙 영역: GC에 의해 관리되는 영역이다. 동적 메모리 할당 영역이라고도 하며, 소스상에서 NEW 연산자로 객체를 만들때 할당되는 영역이다.
    3. 런타임 스택 영역: 프로그램 실행 중 발생하는 메서드 호출과 복귀에 대한 정보를 저장한다.
    4. 네이티브 메서드 스택영역: 자바에는 하드웨어를 직접 제어하는 기능이 없기 때문에, 필요할 경우 C언어와 같은 다른언어의 기능을 빌려 사용한다. 이때 사용하는 기술이 JNI(Java Native Inteface) 기술로 네이티브 메서드들이 바이트 코드로 변환되면서 사용되고 기록하는 영역이다.

JDK와 JRE의 차이:

JDK(Java Development Kit): 자바 개발을 위해 만들어 놓은 툴이다.
JRE(Java Run Environment): 자바를 실행할 수 있는 실행환경이 들어있다.

출처:링크텍스트


참고링크
참고링크

0개의 댓글