-
[자바 스터디] 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.카테고리 없음 2022. 10. 3. 16:39
-JVM이란 무엇인가
JVM : Java Vitrual Muchine, 자바를 실행하기 위한 가상머신
자바로 작성된 프로그램은 모두 JVM에서만 실행되기 때문에 JVM이 반드시 필요하다.

자바 프로그램과 일반 프로그램 비교 일반 애플리케이션의 코드는 OS만 거치고 하드웨어에 전달되지만 Java 애플리케이션의 코드는 JVM을 한번 더 거친다.
Java 애플리케이션은 JVM과만 상호작용하기 때문에 OS와 독립적이다. 즉, windows에서 작성한 Java코드를 Mac에서 실행시킬 수 있다. (단, JVM은 OS에 종속적이다.)
-컴파일 하는 방법, 실행하는 방법
Java로 프로그램을 작성하기 위해서는 JDK를 설치해야 한다.
(JDK : Java Development Kit, 자바 개발 도구)
JDK를 설치하면 JVM, Java API( 라이브러리 )와 함께 몇몇 프로그램이 같이 설치되는데 이 중 세개의 프로그램만 살펴보자면,
- javac.exe : 자바 컴파일러, 자바 소스코드를 바이트코드로 컴파일한다.
- java.exe. : 자바 인터프리터, 컴파일러가 생성한 바이트코드를 해석하고 실행한다.
- javap.exe : 자바 역어셈블러, 컴파일된 클래스 파일을 원래의 소스로 변환한다.
명령 프롬프트 혹은 터미널 - 자바 파일 저장 경로로 이동 - javac 코드.java -> 자바 컴파일러가 코드.java를 컴파일해서 코드.class 파일을 생성한다.
명령 프롬프트 혹은 터미널 - 자바 파일 저장 경로로 이동 - java 코드 -> 자바 인터프리터가 코드.class 파일을 해석하고 실행한다.

자바 코드 컴파일 및 실행 -바이트코드란 무엇인가
바이트코드 : 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
자바 바이트코드 : JVM이 실행하는 명령어의 집합으로 컴파일하면 생성되는 .class 파일이 바이트코드를 담고 있다.
-JIT 컴파일러란 무엇이고 어떻게 동작하는가
JIT 컴파일러 : Just-in-time compiler
컴퓨터 프로그램을 만드는 방법은 인터프리터 방식과 컴파일 방식 두 가지로 나눌 수 있다.
인터프리터 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하는 반면 (ex. python)
컴파일 방식은 실행하기 전에 프로그램 코드를 기계어로 번역한다. (ex. C)
JIT 컴파일러는 이 두가지 방식을 혼합한 방식으로 이해할 수 있다. JVM이 이미 컴파일 된 바이트코드를 읽으며 인터프리팅 하는 단계에서 JIT 컴파일러가 동적 컴파일을 통해 머신코드로 컴파일 가능한 코드들을 한 번 더 컴파일 한다.
정리하면 자바 컴파일러가 코드를 바이트코드로 변환한 다음, 실제 바이트코드를 실행하는 시점에 JVM이 JIT 컴파일을 통해 기계어로 변환한다.
-JVM의 구성요소
1. Class Loader
Class Loader는 바이트코드를 실행할 때 바이트코드를 JVM에 로딩, 링킹, 초기화 하는 역할을 한다.
2. Memory
method 영역, heap 영역, stack 영역, native mathod stack 영역이 있다.
method 영역 : 프로그램 실행 중 클래스가 사용되면 해당 클래스의 인스턴스 변수, 메소드 코드, 클래스 변수 등이 method 영역에 저장된다.
heap 영역 : 사용자가 관리하는 인스턴스가 생성되는 공간으로 객체를 동적으로 생성하면 인스턴스가 heap 영역에 할당되어 사용되며, GC의 대상이 되는 영역이다.
stack 영역 : 프로그램 실행 도중 발생하는 매소드 호출, 복귀에 대한 정보다 저장된다.
native method stack 영역 : 자바 이외의 다른 언어로 작성된 코드를 실행할 때 사용된다.
3. Execution engine
적재된 바이트코드를 실행하는 엔진으로 바이트코드를 명령어 단위로 읽어서 실행하는데 인터프리터 방식과 JIT방식을 사용한다.
GC(garbage collecor)가 존재하는 영역이다. 자바는 개발자가 스스로 메모리를 관리하지 않고 GC를 통해 자동적으로 관리한다.
GC는 힙 영역에서 사용하지 않는 객체들을 제거해준다.