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



1. JVM이란 무엇인가

Java Virtual Machine 으로 시스템 메모리를 관리하고 Java 기반 애플리케이션을 위한 실행환경을 제공 하는 머신(프로그램) 


기능은 대표적으로 두가지가 있다.

첫번째는 자바를 모든 기계 또는 모든 운영체제에서 작동 가능하게 하는것과 

프로그램 메모리를 최적화 및 관리 해주는 역할이다. 


기술적 정의로는 "JVM은 코드를 실행하고 그 코드에 대한 런타임 환경을 제공하는 소프트웨어 프로그램의 규격"

일상적 정의로는 "JVM은 자바를 실행하기 위한 방법" 정도라고 볼 수 있다..


가비지 콜렉터라는 프로세스가 사용되지 않는 메모리를 지속적으로 식별하고 제거해 주는 역할을 해서 메모리를 최적화 해준다. 


2. 컴파일 하는 방법

javac 라는 JDK 에 포함된 자바컴파일러를 통해서 컴파일 합니다. 

이때 컴파일 하려는 대상(소스)에 대한 정보를 알고 있어야 함으로 -sourcepath 옵션으로 

관련 소스 파일의 위치를 지정 해줄 수 있다. 

컴파일을 통해 생성된 실행 파일은 .class 즉 클래스 파일이 되는데 이때 클래스 파일의 위치를 지정하는 것이 -classpath 옵션이다.


2-1. javac 옵션 조사

javac 명령어는 
javac <options> <source files> 
이렇게 실행 할 수 있는데 이때 option의 종류는 아래와 같다. 

-classpath
classpath(cp) path (파일 절대 경로) : 컴파일러가 참조할 클래스 파일들을 찾기 위해서 컴파일 시 파일 경로를 지정합니다.

-sourcepath 
sourcepath path (소스 경로) : 소스파일의 위치를 지정합니다.

-target 
target 자바버전 : 지정된 자바버전의 VM에서 작동 되어지도록 클래스 파일을 생성합니다.
ex) javac -target 1.8 Hello.java 

-bootclasspath
bootclasspath path : 특정한 bootstrap또는 확장 클래스를 지정할 수 있습니다.

- d
d diretory : 클래스 파일을 생성 할 루트 디렉터리를 지정합니다. 
이 옵션이 없다면 소스파일이 위치한 디렉터리에 클래스 파일을 생성합니다.

-encoding 
encoding encoding name : 소스파일에 사용된 문자열 인코딩을 설정합니다. 
이 옵션이 없다면 기본적으로 라인 넘버만 생성 합니다.

-g : 모든 디버깅 정보를 생성시킵니다. 
이 옵션이 없다면 기본적으로 , 라인넘버만 생성합니다.

-nowarn : 경고 메시지를 생성 하지 않습니다.

-verbose : 컴파일러와 링커가 현재 어떤 소스파일이 컴파일 되고 있고, 링크되고 있는지 
그 정보를 출력합니다. 

-deprecation : 소스 코드내에서, 사용되어진 deprecated API 위치를 출력합니다.

-extdirs 
extdirs directory : 특정한 학장 디렉토리를 지정합니다. 


3. 실행하는 방법

이전 컴파일을 통해 만든 자바파일의 이름이 hello.java 였다면 컴파일을 통해 

hello.class 파일이 생성된 것을 확인 할 수 있을것이다. 이것은 java hello 라는 명령어로 실행 시킬 수 있다.  


4. 바이트코드란 무엇인가

바이트코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법 입니다. 기계어가 아닌 중간단계의 형태로, 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에 보통 기계어보다 더 추상적입니다. 

자바 바이트코드란 자바 가상머신이 실행하는 명령어의 형태이며, 자바에서 컴파일된 코드를 의미합니다. 바이트코드는 .class 파일형태이지만 .exe처럼 실행 가능한 파일이 아니라 JVM을 통해 실행시켜야 합니다. 


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

Just In Time 컴파일러는 실시간으로 컴파일을 하는 컴파일러라고 보면 됩니다.

java 바이트코드를 런타임시 네이티브 머신코드로 컴파일 하여 사용합니다.

즉 자주 사용하는 코드를 모니터링 하여 빈도가 높은경우 해당 정보를 캐싱 합니다. 

다음 실행때 중복되는 코드가 있다면 캐싱된 데이터를 사용하여 실행 속도를 올리는것으로 매번 전체 코드를 컴파일 하는 고전적 방식과 차이점을 보입니다. 


6.JVM 구성 요소

class loader - JVM 내로 클래스를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈로써 런타임 시 동적으로 클래스를 로드합니다. 

Execution Engine  (JIT / interpreter) - 컴파일을 하는 부분으로 자바 바이트코드를 읽어서 실행합니다. 

Garbage collector - 메모리 관리 기능을 자동으로 수행합니다. 애플리케이셔이 생성한 객체의 생존 여부를 판단하고 더 이상 사용되지 않는 객체를 삭제 하는 식으로 관리 합니다. 

Runtime Data Area - JVM이라는 프로세스가 프로그램을 수행하기 위해 OS에게 할당받은 메모리 공간으로 아래의 5개로 나눠집니다. 


◆ Method Areas : 프로그램의 흐름을 구성하는 바이트코드 들이 올라가는 메모리 공간입니다. 클래스, 변수, method, static 변수, 상수 등의 정보들이 저장되며, 사실상 컴파일 된 바이트코드의 대부분이 메소드 바이트 코드기 때문에 거의 모든 바이트코드가 올라가는 곳이라고 볼 수 있습니다.

◆ Heap Area : new 연산자로 생성된 객체와 배열, 인스턴스가 저장되는 공간입니다. 런타임 시 동적으로 할당하여 사용하는 영역이고 GC(garbage collection)가 일어나는 곳입니다.

◆ Stack Area : 각 thread 별로 하나씩 존재하는 공간이며, 시작과 동시에 할당됩니다.

메소드를 호출할 때마다 프레임을 추가하고 종료되면 해당 프레임을 제거하며 LIFO 구조입니다.

◆ PC Register : 현재 수행중인 JVM의 명령주소를 갖습니다. 프로그램이 실행 되는 동안 필요한 정보를 CPU내 기억장치인 레지스터에 저장합니다. 

◆ Native Method Stack : JAVA가 아닌 다른언어로 작성된 코드를 위한 공간입니다. JAVA Native interface를 통해 바이트코드로 전환하여 저장하고, 언어에 맞게 stack을 형성합니다. 일반 프로그램처럼 커널스택을 잡아 독자적으로 프로그램을 실행 시키는 영역입니다.


7. JDK와 JRE의 차이

JDK (Java Development Kit) - 자바로 프로그램을 개발하기 위한 소프트웨어 개발 키트입니다. 코드를 개발, 디버깅 및 모니터링 하기 위한 도구가 모두 포함돼 있습니다. 

JRE (Java Runtime Environment) - 자바 실행환경으로 자바를 실행할 수 있는 최소한을 제공합니다. 클래스 라이브러리, JVM 및 기타 지원파일을 포함하고 있습니다.

쉽게 말해 JVM 에 Library Classes 를 더한 것이 JRE 

JRE 에 개발 도구까지 더한 것이 JDK 라고 볼 수 있습니다. 

댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제