JAVA

백기선-JAVA STUDY/WEEK1

jCurve 2020. 12. 19. 00:15
728x90
반응형

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

학습할 것


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

JVM 이란 무엇인가


JVM (Java Virtual Machine - 자바 가상 머신)

c/c++등 자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상 컴퓨터의 cpu와 운영체제에 종속적인 코드로 변환을 합니다. 따라서 이 코드를 다른 플랫폼(다른 cpu나 운영체제)에서 실행하려면 다시 컴파일하든지 플랫폼에 맞도록 코드를 수정해야한다. - - 플랫폼 종속적인 특징

이러한 언어의 플랫폼 종속적인 특징의 단점을 극복할 수 있는것이 JVM이다.

JVM은 소프트웨어로서 서로 다른 플랫폼에서 실행되는 자바 프로그램에 동일한 환경을 제공해줍니다.

C/C++과 같은 언어가 플랫폼에 종속적인 것과는 다르게 자바는 언어 자체의 플랫폼 종속은 없지만 JVM이 플랫폼 종속적 입니다. 따라서 각 플랫폼 마다 JVM이 서로 다르게 작성되어있습니다.

즉, 윈도우 OS에서 설치한 JVM에서 개발한 자바 프로그램을 ,리눅스 OS에서 설치한 JVM에서 돌릴 수 있는 장점이다.

컴파일 하는 방법


개발자가 프로그램을 여러개의 소스 파일(.java)로 나누어 작성하며, 자바 컴파일러(javac.exe)는 각 소스 파일을 컴파일하여 클래스 파일(.class)를 생성합니다. 기존의 다른 언어의 컴파일러들은 코드를 바로 기계어로 바꾸지만 이렇게 되면 컴파일 환경이 기계어에 영향을 주기때문에 위에서 말한 것 과 같이 플랫폼 종속성에서 벗어 날 수가 없습니다. 따라서 자바는 바로 기계어로 바꾸는 것이 아니라 바이트코드로 이루어진 클래스 파일(.class)을 생성합니다. 그리고 이 클래스 파일을 JVM이 실행(해당 운영체제 맞는 기계어로 변환하여) 시켜주기 때문에

한번 작성하면 어디서든 프로그램이 돌아간다는 장점이 생기는 것이다.

실행방법


자바의 실행 방법만 봐서는 그게 표준인지 , 이러한 실행 방법이 일반적인 것인지 착각할 수 있습니다.

C/C++의 경우 프로그램을 작성하고 컴파일하면 오브젝트파일(.obj)이 생성되고 , 이것을 링크 과정을 통해 하나의 실행 파일(.exe)를 만듭니다. 바로 이 링크 과정에서 프로그램에서 호출한 함수를 라이브러리에서 꺼내 실행파일에 삽입하는데 이렇게 한다면 프로그램을 실행하기 위해 실행파일에 필요한 것들을 전부 삽입하기 때문에 용량이 커집니다. 따라서 애초에 적은 량의 메모리를 가진 컴퓨터라면 실행조차 할 수가 없습니다. 이부분이 문제라고 생각하실 수 있습니다. 하지만? 실행파일에 필요한 것들을 전부 링크해 두었기 때문에 어떻게 보면 실행 파일만 있으면 실행에는 문제가 없습니다. 이렇게 보면 또 장점같죠

그렇다면 자바는?

자바는 프로그램을 여러 소스파일(.java)로 나누어 작성하며, 각 소스 파일을 컴파일하여 클래스 파일을 생성합니다.

하지만 자바는 하나의 실행 파일로 뭉치는 링크 과정이 없습니다.

개발자가 클래스 파일 하나를 지정하여 실행한다면 JVM이 그 클래스 파일을 메모리에 로딩하고 실행합니다.

실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일이 필요하면 , JVM은 그때 그 클래스 파일을 로딩하여 실행합니다.

이런식으로 필요한 순간 순간에 동적으로 클래스 파일을 로딩하여 실행한다면? 적은 량의 메모리를 가진 컴퓨터에서도 얼마든지 큰 자바 응용프로그램을 실행할 수 있을겁니다.

그럼 아마 이런 생각을 하시는 분이 있을 수 있습니다.

"아니 그러면 필요할 때마다 클래스를 로딩하면 로딩하는데 시간이 걸릴텐데 그럴바엔 애초에 필요한 것들을 다 뭉쳐서 실행 파일 하나로 만드는게 더 좋지 않나? "

평소에는 클래스 로더가 동적으로 필요한 클래스를 로딩하지만, 컴퓨터 메모리가 충분한 경우라면 실행중에 클래스를 로딩하는 것이 아니라 개발자가 직접 (ClassLoader 객체를 사용) 로딩하거나 미리 로딩하여 시간이 걸리는 부분을 줄 일 수 있습니다.

바이트 코드란?


바이트 코드는 자바 가상 기계에서만 실행되는 기계어로서, 어떤 cpu와도 관계없는 바이너리 코드입니다.

자바 컴파일러가 소스 파일을 컴파일하여 만든 이 바이트 코드는 JVM이 인터프리터 방식으로 실행시킵니다.

CPU와 관계없이 JVM이 실행시키 때문에 플랫폼과 관계없이 JVM만 설치되어 있다면 프로그램이 동일하게 동작합니다.

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


JIT(JUST-IN-TIME) 영어 뜻 그대로 제 시간에 컴파일을 한다는 뜻이다..

위에서 말했던 것 처럼 JVM은 바이트 코드를 인터프리터 방식으로 실행시킵니다.

인터프리터 방식이란 바이트 코드를 실행함에 있어 한 줄 씩 수행시키는 방식입니다. 한 줄 씩 실행시킨다면 실행에 느리다는 단점이 있습니다. 따라서 이러한 단점을 보완하기 위해서 도입된 것이 JIT 컴파일러입니다.

JIT 컴파일러는 인터프리터 방식으로 실해하다가 적절한 시점에 바이트 코드를 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행 하도록 하는 기법입니다.

JIT 컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅 하는 것보다 훨씬 오래걸립니다. 따라서 JIT컴파일러를 사용하는 JVM은 해당 메서드가 얼마나 자주 수행되는지 체크 후 일정 정도를 넘을 때에만 컴파일을 수행합니다.

JVM 구성요소



참조:https://dailyheumsi.tistory.com/196

JVM의 구성은 이렇다 위에서 언급한 클래스 로더, JIT컴파일러,인터프리터를 제외하더라도 많이 있다.

Execution Engine

클래스를 실행시키는 역할로서 클래스 로더가 JVM 런타임 데이터 영역에 배치한 바이트 코드를 실행 엔진이 JVM 내부에서 기계가 실행할 수 있는 형태로 변형시킨다

GC(Garbage colloector)

자바 언어는 메모리를 할당받는 기능은 있지만, 메모리를 반환하는 기능은 없다. 따라서 GC가 프로그램 내에 사용되지 않는 메모리를 자동으로 회수해준다.

Runtime Data Area

프로그램을 수행하기 위해 os에서 할당받은 메모리 공간

PC Register

Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재하며 어떤 부분을 어떤 명령어로 실행해야할 지에 대한 기록을 하는 부분, 현재 수행 중인 JVM 명령의 주소를 갖는다.

STACK

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 소멸되는 특성의 데이터를 저장하는 영역.

각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.

메소드 호출시 각각의 스택 프레임이 생성된다. 메서드 수행이 끝나면 프레임 별로 삭제를 하고 메소드 안에서 사용되는 값들을 저장하며 호출된 메소드의 매개변수,지역변수,리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.

Native method stack

자바가 아닌 다른 언어로 작성된 코드를 위한 공간으로 Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다. 일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.

Method Area

스태틱 영역이라고도 불리고, 클래스로더가 처음 바이트코드를 읽어서 여러 정보를 저장해두는 곳이다.

Heap

동적으로 할당되는 대부분의 정보가 저장되는 영역으로, 인스턴스들의 정보가 여기 저장된다.

참조되지않는 객체를 GC가 관리해준다.

JDK 와 JRE 차이


JRE(Java Runtime Environment)는 자바 실행 환경을 의미하며

말그대로 자바 프로그램을 실행시키기 위해 필요한 JVM과 JVM을 동작시키기 위한 라이브러리를 포함하게된다.

개발하는것이 아니라 단지 자바 프로그램을 실행시키기 위해서라면 JDK는 필요없지만 JRE는 필요하다.

JDK(Java Development Kit)는 자바로 프로그램 개발을 하기위한 모든 것을 포함한 kit이다.

자바를 개발하기 위한 Tool 과 실행하기위한 JRE도 당연히 포함되어 있다.

반응형