스터디할래 - 1주차 과제

나승학·2020년 11월 19일
2

스터디할래

목록 보기
1/3
post-thumbnail

스터디 할래 - 깃헙 페이지
이미지 작성 - draw.io

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


JVM이란 무엇인가

JVM은 Java Virtual Machine의 약자로 자바 프로그램은 완전한 기계어가 아닌 바이트코드로 되어 있기 때문에, 바이트코드를 해석하고 실행하는 가상의 운영체제가 필요하다. 이것이 JVM이며, 운영체제 별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계되어 있다. 따라서 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.

	이미지1. 자바 프로그램 실행 단계

컴파일 하는 방법

컴파일이란 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 얘기하며, 자바에서 컴파일러의 역할은 "이미지1"에서 볼 수 있듯이 소스 파일(.java)을 바이트코드(.class)로 변환하는 역할을 한다.

                   <Hello.java>
                   public class Hello {
                       public static void main(String[] args) {
                           System.out.println("Hello World!");
                       }
                   }

자바 코드인 Hello.java를 컴파일 및 실행하는 방법은 아래에서 설명하고자 한다.

실행하는 방법

	이미지2. Bash shell에서 자바 코드 컴파일 및 실횅
	

	이미지3. 윈도우의 명령 프롬프트에서 자바 코드 컴파일 및 실행
                    

이미지2, 3에서 보면 'javac Hello.java'로 컴파일을 하면 java.class인 바이트코드가 생성이 되고, 해당 바이트코드를 'java Hello'로 실행하여 "Hello World!"가 출력되는 것을 확인할 수 있다.

바이트코드란 무엇인가

바이트코드(Bytecode)란 사람(프로그래머)이 작성한 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.(위키피디아에서는 이진표현법이라고 설명학고 있다.)
이미지 2, 3에서 Hello.class를 바이트코드라 할 수 있다.

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

JIT은 Just In Time의 약자이며 JIT 컴파일러는 런타임(실제 실행하는)시점에 기계어로 변환된 코드를 캐싱하기 때문에 재사용시 컴파일을 다시 할 필요가 없으며, JVM 내부의 최적화를 통해 JIT 컴파일러의 성능을 향상시켰다.

	이미지4. 컴파일 타임과 런타임에 동작하는 자바 프로그램 동작 과정
                

JVM 구성 요소

  • Class Loader
    java 파일을 javac로 컴파일하면 바이트코드가 생성이 되고, 해당 파일을 컴파일 타임이 아닌 런타임에 메모리로 올려서 실행하는 부분이 Class Loader이다. 클래스 로더의 실행 순서는 아래 그림과 같으며, 크게는 Load -> Link -> Initialize 3단계로 볼 수 있고, Link의 과정을 세부적으로 나누면 3단계(Verify -> Prepare -> Resolve)로 구분지을 수 있어 총 5단계로 볼 수도 있다.

			이미지5. 클래스 로더 세부 실행 단계
  • Execution Engine
    Execution Engine은 class loader를 통해 배치된 클래스를 해석하여 실행시키며 이 때, 인터프리터 방식과 JIT 방식으로 실행 된다.

  • Runtime Data Area
    Runtime Data Area는 JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역이다.
    5개의 영역으로 나뉘어져 있으며 다음과 같다.

    • Method Area
    • Heap
    • JVM Stacks
    • PC Registers
    • Native Method Stacks
  • Garbage Collector
    Garbage Collector는 줄여서 GC라고도 부르며, 동적으로 할돵된 메모리 영역 중에서 사용할수 없는 영역을 탐지해 해제하는 기능이다. 따라서 자바 프로그램 개발 시 개발자는 동적으로 할당한 메모리 해제를 GC가 처리해주기 때문에 개발에 집중 할 수 있게 해준다는 장점이 있다.

			이미지6. JVM 구조
            
       

JDK와 JRE의 차이

  • JDK
    JDK란 Java Development Kit의 약자이며, JDK는 프로그램 개발에 필요한 JVM, 라이브러리 API, 컴파일러 등의 개발 도구가 포함되어 있다.
  • JRE
    JRE란 Java Runtime Environment의 약자이며, JRE는 프로그램 실행에 필요한 JVM, 라이브러리 API가 포함되어 있다.

자바 프로그램을 개발하고자 하는 것이 아닌, 이미 개발된 프로그램만 실행하기를 원한다면 JRE만 설치되어 있어도 무방하다.

			이미지7. JDK & JRE 포함 관계
	

References

이것이 자바다(신용권 저, 한빛미디어)
바이트코드 - 나무위키
바이트코드 - 위키피디아
JIT컴파일 - 위피키피다
JVM 구성 요소
JVM 구성 요소2

profile
자바와 스프링으로 개발하는 것을 좋아합니다.

0개의 댓글