티스토리 뷰

JVM이란 무엇인가?

  • Java Virtual Machine이라고 한다.

JVM의 역할

  • 자바 애플리케이션을 Class Loader를 통해 읽어 들여 자바 API와 함께 실행하는 것.
  • JVM은 Java와 OS 사이에서 중개자 역할을 수행.(JAVA가 특정 OS에 구애받지고 재사용을 가능하게 해준다.)
  • 메모리관리, Garbage Collection을 수행.

실행 과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.
  2. 자바 컴파일러가(Javac) 자바 코소스코드를 읽어들여 자바 바이트코드로 변환(.java -> .class).
  3. Class Loader를 통해 class파일들을 JVM으로 로딩.
  4. Execution engine을 통해 .class파일을 해석.
  5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어진다.

자바가상머신(Java Virtual Machine, JVM)/메모리구조


컴파일 하는 방법

  1. javac test1.java --> java compiler로 자바 소스파일을 바이트 코드로 변환(.class).
  2. test1.class파일이 생성된다.

실행하는 방법

java [파일명]


바이트코드란 무엇인가

자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드.

자바 컴파일러(Javac)에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불린다.

확장자는 .class

자바 바이트 코드는 자바 가상 머신(JVM)만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.


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

인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후에는 해당 메서드를 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식.

하나씩 인터프리팅하여 실행하는 것이 아니라 바이트코드 전체가 컴파일된 네이티브 코드를 실행하는 것이기 때문에 전체적인 실행 속도는 인터프리팅 방식보다 빠르다.

  • JIT 컴파일러로 생성된 네이티브 코드는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 캐시에서 바로 꺼내어 실행가능(빠르다).
  • 하지만 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 하나씩 인터프리팅 하는 것보다 훨씬 오래 걸리기 때문에 JIT 컴파일러를 사용하는 JVM은 내부적으로 해당 메서드가 얼마다 자주 호출되고 실행되는지 체크하고, 일정 기준을 넘었을 때에만 JIT 컴파일러를 통해 컴파일하여 네이티브 코드를 생성한다.
  • 바이트 코드 -> JIT 컴파일러 -> IR(Intermediate Representation)로 변환 -> 최적화 수행 -> 네이티브 코드

JVM 구성 요소


클래스 로더

  • 계층구조
  • 위임모델
  • 가시성 제한
  • 언로드(unload) 불가
  • 이름공감(name space)

계층구조

Java Class Loaders Explained | Java Tutorial Network


부트스트램 클래스 로더


  • 최상위 클래스로더로 유일하게 JAVA가 아니라 네이티브 코드로 구현이 되어있다.
  • JVM이 실행될 때 같이 메모리에 올라간다.
  • Object 클래스를 비롯하여 JAVA API들을 로드한다.

익스텐션 클래스 로더


  • 기본 JAVA API를 제외한 확장 클래스들을 로드한다.(다양한 보안 확장기능 로드)

시스템 클래스 로더(System Class Loader)


  • 부트스트랩과 익스텐션 클래스로더가 JVM 자체의 구성요소들을 로드한다면, 시스템 클래스 로더는 애플리케이션의 클래스들을 로드한다.
  • 사용자가 지정한 $CLASSPATH 내의 클래스들을 로드한다.

사용자 정의 클래스(Custom Class)


  • 애플리케이션 사용자가 직접 코드상에서 생성하여 사용하는 클래스 로더.

런타임 데이터 영역

JVM이 운영체제 위에서 실행되면서 할당받는 메모리 영역. Class Loader에서 준비한 데이터들을 보관하는 저장소.

JVM Run-Time Data Areas


Method (Static) Area: JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간이다.

Runtime Constant Pool

  • 메소드 영역에 포함되지만 독자적 중요성이 있다.
  • 클래스 파일 constant_pool 테이블에 해당하는 영역이다.
  • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 레퍼런스를 저장한다.
  • JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조한다

메소드 영역/런타임 상수 풀의 사용기간 및 스레드 공유 범위

  • JVM 시작시 생성

  • 프로그램 종료 시까지

  • 명시적으로 null 선언 시

  • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.

  • 모든 스레드에서 공유한다.

Heap Area

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

  • New 연산자로 생성된 객체 또는 객체(인스턴스)와 배열을 저장한다.

  • 힙 영역에 생성된 객체와 배열은 스택 영역의 변수나 다른 객체의 필드에서 참조한다.

  • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되어 GC의 대상이 된다.

  • 힙 영역의 사용기간 및 스레드 공유 범위

    • 객체가 더 이상 사용되지 않거나 명시적으로 null 선언 시
    • GC(Garbage Collection) 대상
    • 구성 방식이나 GC 방법은 JVM 벤더마다 다를 수 있다.
    • 모든 스레드에서 공유한다.

Stack Area

  • 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
  • 메소드를 호출할 때마다 프레임(Frame)을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop)하는 동작을 수행한다.
  • 선입후출(FILO, First In Last Out) 구조로 push와 pop 기능 사용
  • 메소드 호출 시 생성되는 스레드 수행정보를 기록하는 Frame을 저장
  • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
  • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.
  • 참조타임 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

PC Register

  • 현재 수행 중인 JVM 명령 주소를 갖는다.
  • 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
  • CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장한다.
  • 연산 결곽값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치

Native Method Stack Area

  • 자바 외 언어로 작성된 네이티브 코드를 위한 Stack이다.
  • 즉, JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
  • 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장한다.

출처: https://hoonmaro.tistory.com/19 [훈마로의 보물창고]


실행 엔진

Class Loader를 통해 JVM 내의 런타임 데이터 영역에 배치된 바이트 코드를 실행한다. 이 때, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.


JDK와 JRE의 차이

요약

  • JDK=JRE+@
  • JRE는 읽기전용, JDK는 읽기/쓰기 전용

JRE(Java Runtime Environment)


JRE는 Java Runtime Environment의 약자로 자바 프로그램을 실행시켜주는 환경을 구성해주는 도구다. 즉 JAVA를 개발할 필요는 없는데, 실행은 시켜줘야 하는 경우에는 꼭 JRE가 있어야 한다. 반면 JAVA 개발시 꼭 필요한 것이 있는데 그것이 바로 JDK다.

  • JRE는 JVM이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
  • JRE는 JVM의 실행환경을 구현했다고 할 수 있다.
  • 자바 프로그램을 실행시키기 위해서는 JRE를 반드시 설치해야 한다.
  • 하지만 자바 프로그래밍 도구는 포함되어있지 않기 때문에 자바 프로그래밍을 하기 위해선 JDK가 필요하다.

JDK(Java Development Kit)


JDK는 Java Development Kit의 약자로 말그대로 자바 개발시 필요한 툴킷을 제공하는 도구모음이다. 개발하려면 당연히 실행도 시켜야 하므로 JDK 안에는 JRE가 포함되어 있다.

  • JDK는 개발을 위해 필요한 도구(javac, java등)들을 포함한다.
  • JDK를 설치하면 JRE도 같이 설치가 된다.
  • JDK = JRE + @ 라고 생각하면 된다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함