ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 항해일지 - 1. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
    공부일기/자바 스터디 2020. 11. 17. 15:56
    • JVM이란 무엇인가
      • 자바 가상 머신(Java Virtual Machine)의 약자.
      • 자바 바이트코드를 실행할 수 있는 주체.
      • 자바가상 머신 규격에 정의된 대로 자바 바이트코드를 실행하기 때문에 이론적으로는 CPU나 운영체제에 상관없이 동일하게 동작하는 것을 보장한다.
      • 스택기반의 가상머신이며 메모리 관리 및 가비지 컬렉션(메모리 관리 기법 중의 하나. 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능)을을 수행한다.

    이미지 출처: https://asfirstalways.tistory.com/158

     

     

    • 컴파일 하는 방법
      • 소스코드를 .java 확장자로 저장한다.
      • 커맨드창에서 컴파일 하고자하는 클래스의 경로를 찾아가서 javac 명령어를 앞에 붙이고 실행
      • .class 파일이 생성된 것을 확인한다.(컴파일 완료)
        • 추가 옵션:
          • -encoding: -encoding utf-8을 이용해 한글이 포함된 파일도 컴파일 할 수 있다.
          • -source, -target 옵션을 사용해 하위 JDK 버전에서도 실행되도록 할 수 있다. 다만 이전 버전에서 지원되지 않는 기능은 사용할 수 없다. (이 경우 에러 발생)

     

     

    • 실행하는 방법
      • 인텔리제이, 이클립스 등을 통해 실행한다.
      • 커맨드창에서 실행하고자 하는 .class 파일의 경로를 찾아가 java .class를 떼고 java 로 실행한다.

     

     

    • 바이트코드란 무엇인가
      • 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법.
      • 자바의 경우 대략 200개의 바이트코드가 존재한다고 한다.
      • .class 파일이 바이트코드를 담고 있다.
      • OS나 개발환경에 관계없이 같은 명령어 집합을 사용한다.

     

    • JIT 컴파일러란 무엇이며 어떻게 동작하는지
      • 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법. (Just-In-Time)
      • 실행 중 프로그래밍 언어를 읽어가며 해당 기능에 대응하는 기계어 코드를 실행하는 인터프리트 방식과 실행하기 전에 프로그램 코드를 기계어로 번역하는 정적 컴파일 방식을 혼합한 방식이라 생각하면 된다.
      • 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하며 해당 코드를 캐싱하고, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
      • 자바 컴파일러가 자바프로그램 코드를 바이트코드로 변환하고 실제 바이트코드를 실행하는 시점에서 JVM이 바이트코드를 JIT 컴파일을 통해 기계어로 변환한다.

     

     

    • JVM 구성 요소
      • 클래스로더, 실행 엔진, 런타임 데이터 영역(메모리 영역)으로 구성. (위의 사진 참조)
      • - 클래스 로더: 컴파일된 자바 바이트코드를 런타임 데이터 영역에 로드한다.
      • - 실행 엔진: 클래스 로더를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트코드를 실행한다.
      • - 런타임 데이터 영역

    이미지 출처: https://coding-start.tistory.com/205

    • Method Areas : 클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역 (모든 Thread가 공유)
    • Heap Area : new 명령어로 생성된 인스턴스와 객체가 저장되는 구역
    • Stack Area : Java Method 내에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역, 메소드가 호출될 때 LIFO로 하나씩 생성되고, 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.(각 Thread별로 하나씩 생성)
    • PC Register : CPU의 Register와 역할이 비슷하다. 현재 수행 중인 JVM 명령의 주소값이 저장 (각 Thread별로 하나씩 생성)
    • Native Method Stack : 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역

     

     

    • JDK와 JRE의 차이

      • JDK(Java Develpment Kit) : 개발도구, JRE와 개발용 라이브러리들을 포함한다.

    이미지 출처: https://wikidocs.net/257

     

    • JRE(Java Runtime Environment) : JVM용 운영체제(OS의 역할), JVM이 자바 프로그램을 실행하기 위한 라이브러리와 파일들을 포함한다.

    이미지 출처: https://wikidocs.net/257

     

     

    참고.

    odol87.tistory.com/5

    ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

    iamsang.com/blog/2012/08/19/introduction-to-java-bytecode/

    ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C

    ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0

    asfirstalways.tistory.com/158

    sarc.io/index.php/java/274-javac-java-compile-source-target-encoding

    cosmosproject2015.tistory.com/148

     

Designed by Tistory.