자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

동아리원들과 함께 자바 스터디를 구성했다. 방식은 백기선님이 진행하셨던 자바 스터디와 동일하며 하나의 큰 대주제와 그에 따른 소주제들을 공부한 후 블로그에 포스팅해나가려고 한다.

JVM은 'Java Virtual Machine'의 준말로 '자바를 실행하기 위한 가상 기계'라고 할 수 있다.

자바로 작성된 어플리케이션은 모두 이 JVM에서만 실행되기 때문에 자바 어플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다. JVM은 프로그램 메모리를 관리하고 최적화하는 역할도 하지만, 가장 큰 역할은 Java Byte Code를 OS에 맞게 해석해주는 것이다.

C, C++, GO와 같은 네이티브 언어로 작성된 어플리케이션은 OS만 거치고 바로 하드웨어로 전달되는 반면, Java로 작성된 어플리케이션은 JVM을 한 번 더 거쳐야만 하드웨어로 전달된다. 이 과정을 간략하게 설명하자면 다음과 같다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga
JavaWorld/ IDG

먼저 javac 컴파일러는 .java 파일을 .class라는 자바 바이트 코드로 변환시켜 준다. 변환된 바이트 코드는 JRE에 들어있는 클래스로더에 의해 JVM으로 로드되며, 이때 JVM은 OS가 바이트 코드를 이해할 수 있도록 해석(interpret)해준다. 왜냐하면, 바이트 코드는 기계어가 아니므로 OS에서 바로 실행되지 않기 때문이다. 이러한 이유로 속도가 느리다는 단점이 있었지만, JIT 컴파일러와 향상된 최적화 기술을 통해 이점을 극복했다.

Java 어플리케이션은 JVM과 상호작용을 할 뿐, OS와 하드웨어에 독립적이기 때문에 다른 OS에서도 프로그램의 변경없이 실행이 가능하다. 바로 이것이 "플랫폼에 독립적이다"라는 Java의 장점이다. 다만, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.

바이트 코드(Bytecode)란?

바이트 코드는 고급 언어(C, C++, Java ...) 로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 의미한다.

자바 바이트 코드는 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드(.class)이며, 이렇게 변환된 코드의 명령어 크기는 1바이트이다.

JVM의 구성

JVM은 크게 클래스 로더(Class Loader), 실행 데이터 영역(Runtime Data Areas), 실행 엔진(Excution Engine) 3가지로 구성되어 있다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga
https://namu.wiki/w/%EC%9E%90%EB%B0%94%20%EA%B0%80%EC%83%81%20%EB%A8%B8%EC%8B%A0

1. 클래스 로더

  • 런타임 시점에 클래스파일을 로딩, 연결, 초기화하는 작업을 한다.

자바에서는 모든 것이 클래스이며, 모든 자바 애플리케이션은 클래스로부터 만들어진다. 하나의 애플리케이션이 하나 또는 수천 개의 클래스로 구성될 수 있다. 자바 애플리케이션을 실행하기 위해서는, JVM이 컴파일된 .class 파일을 맥락에 따라 액세스 가능한 서버 같은 것으로 로드 해야만 한다.

JVM은 클래스 로더에 의존해 이 기능을 수행한다. 자바 클래스 로더는 클래스를 메모리에 로드하고 실행을 위해 사용할 수 있게 만드는 JVM의 일부다. 클래스 로더는 클래스 로딩(Class Loading)을 최대한 효율적으로 수행하기 위해 지연 로딩(Lazy-loading)과 캐싱(Caching) 같은 기법을 활용한다. 

2. 실행 데이터 영역

- JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당받은 메모리 공간을 의미하며, 크게 5가지 영역으로 나눠진다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

3. 실행 엔진

  • 로드된 클래스의 바이트 코드를 실행한다.

클래스 로더를 통해 JVM 내의 실행 데이터 영역에 배치된 바이트 코드는 실행 엔진에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다. 이러한 실행 엔진은 인터프리터와 JIT 컴파일러, 그리고 가비지 컬렉터(Garbage Collector)로 구성되어 있다.

인터프리터

인터프리터는 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 한다.

JIT 컴파일러

프로그램이 실행 중인 런타임에 바이트 코드를 실제 기계어로 변환해 주는 컴파일러를 의미한다.

JIT 컴파일러는 변환 과정에서 비용이 발생하기 때문에 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.

가비지 컬렉터

자바 프로그램 내부에서 사용되지 않는 메모리를 자동으로 회수하는 역할을 한다. 개발자에게 메모리 관리에 대한 부담을 덜어준다.

JRE와 JDK의 차이

런타임 환경

런타임은 컴퓨터 프로그램이 실행되고 있는 동안의 동작을 의미한다.

런타임 환경은 컴퓨터가 실행되는 동안 프로세스나 프로그램을 위한 소프트웨어 서비스를 제공하는 가상 머신의 상태이다. 

이번에 소개할 JRE가 바로 자바의 런타임 환경이다.

JRE

JRE는 자바 실행환경(Java Runtime Environment)의 약자로, JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다. JRE는 JVM의 실행환경을 구현했다고 할 수 있다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

JDK

JDK는 자바 개발도구(Java Development Kit)의 약자이다.

JDK는 JRE + 개발을 위해 필요한 도구(javac, java등)들을 포함한다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

요약하자면 자바로 만들어진 프로그램을 실행만 시킬 것이라면 JRE만 설치하면 되고, 자바 개발자라면 JDK를 설치하면 된다.

자바 컴파일 및 실행

실제로 자바를 실행해보도록 하자.

Oracle 홈페이지에 들어가서 자신의 자바를 설치하자. 나는 LTS 버전인 Java SE 11을 설치했다.

https://www.oracle.com/java/technologies/javase-downloads.html

설치 후 java -version 명령어를 통해 설치 여부와 설치된 자바의 버전을 확인할 수 있다.

맥에서 자바를 설치하면 자동으로 환경변수를 잡아준다. 아주 간편하다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

메모장이나 본인이 사용하는 텍스터 에디터를 이용해 다음과 같은 파일을 작성한다. 주의할 점은 파일 이름과 클래스 명이 같아야 한다는 것이다. 만약 파일 이름과 클래스 명이 다르면 에러가 발생한다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

javac컴파일러를 이용해 작성한 소스 코드(.java)를 바이트 코드(.class)로 변환한다. 명령어는 javac Hello.java이다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

컴파일이 성공적으로 이루어지면 Hello.class라는 파일이 생긴다. Hello.class파일이 생성되었다 이제 이렇게 생성된 클래스 파일을 실행시켜보도록 하자. 명령어는 java Hello이다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

성공적으로 출력되었다.

요약

자바의 동작원리를 크게 그림으로 표현하자면 다음과 같다.

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga
생활코딩 Java1

우리도 이와 동일한 방식으로 자바를 실행시켰다.

  1. 자바 소스 코드 파일 작성(Hello.java )
  2. 컴파일(javac)
  3. 자바 바이트 코드(Hello.class)
  4. JVM에서 코드를 해석하고 프로그램을 실행
  5. 프로그램에 따라 컴퓨터가 동작("hello world" 출력)

참고

JVM 이란?

# JIT

medium.com

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

자바 가상 머신 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

"JVM이란 무엇인가" 자바 가상 머신 이해하기 - ITWorld Korea

자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다.Credit: JavaWorld/ IDGJVM은 다른 프로그램을 실행시키는 것이

www.itworld.co.kr

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

JIT - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

[Java] JRE와 JDK의 차이

초반에 자바 설치할 때 jre, jdk 등등 용어가 너무 다양해서 헷갈렸다. 처음에는 뭣도 모르고 둘다 설치하고 그냥 이클립스 깔고 개발하곤 했는데, 막상 실무에 들어가니 환경 설정하는 부분이 중

devpouch.tistory.com

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

자바 가살 머신은 어떻게 구성되는가 - jaba gasal meosin-eun eotteohge guseongdoeneunga