[Java]JVM 과 실행방법

정석용·2023년 4월 4일
0

Java

목록 보기
1/15
post-thumbnail

Jvm이란 무엇인가?

Java Virtual Machine의 약자이며 바이트 코드를 실행시키기 위한 가상머신
  • "Write once, Run anywhere" 독립적 플랫폼이며 실행 가능한 환경이면
    실행이 가능.

  • 자바 바이트코드(.class 파일)를 OS에 특화된 코드로 변환하여 실행.

  • 스택 기반의 가상 머신

  • 가비지 컬렉션 사용
    - 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서
    필요없게 된 영역을 해제하는 기능이다.

바이트 코드란?

특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이전 표현법 
H/W 가 아닌 S/W에 의해 처리되기 때문에 기계어보다 추상적이다.
  • 역사적으로 바이트코드는 대부분의 명령 집합이 0개 이상의 매개 변수를 갖는 1바이트 크기의 명령 코드였기 때문에 바이트코드라 불리게 되었다.

  • 한번에 하나의 명령어를 읽은 후 실행 (높은 이식성을 갖는다)

  • 또 다른 형태로서 실시간 번역기 또는 저스트 인 타임(Just-In-Time,JIT) 컴파일러라 불리는 시스템은 실행 중에 필요에 따라서 바이트코드를 기계어로 번역한다.

JVM 구성요소

클래스로더 / 런타임 데이터 영역 / 실행 엔진 /  JNI / 네이티브 메소드 라이브러리

Class Loader

자바 클래스를 자바 가상 머신으로 동적 로드하는 자바 런타임 환경의 일부
  • 각 자바의 클래스는 클래스 로더에 의해 로드.

  • 자바 프로그램들은 외부 라이브러리들을 이용하거나 최소한 수많은 라이브러리들의 한부분 으로 구성.

  • JVM 시작시 3개의 클래스 로더들이 사용
    1.부트스트랩 클래스 로더 (핵심 자바 라이브러리들을 부름)
    2.확장 클래스 로더 (확장 디렉터리 또는 기타 디렉터리에 코드를 로드)
    3.시스템 클래스 로더 (CLASSPATH 환경 변수에 매핑)

Runtime Data Area

JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역

Runtime Data Area은 5가지로 구분된다.
PC Register / JVM stack / Native Method stack / Heap / Method Area

좌측 3개의 영역은 Thread 별로 생성되고 우측 2개의 영역은 모든 Thread를 공유한다.

PC Register

  • 현재 수행중인 JVM Instruction의 주소를 가진다.

JVM stack

  • Thread의 Method가 호출될 때 수행정보(메소드 호출 주소, 매개 변수, 지역 변수, 연산스택)가 Frame 이라는 단위로 JVM stack에 저장된다.

Native Method stack

  • Java 외의 언어로 작성된 네이티브 코드들을 위한 stack.

Heap

  • 인스턴스와 배열이 동적으로 생성되는 공간.
  • Garbage Collection의 대상이 되는 영역. 개발자는 객체를 제거하기 위해 별도의 코 드를 작성할 필요가 없고 부작용만 낳을 가능성이 크다.
  • 모든 Thread가 공유하기 때문에 동기화 문제가 발생할 수 있다.

Method Area

  • class Loader가 적재한 클래스에 대한 메타데이터 정보가 저장된다.
  • 이 영역에 등록된 class만이 Heapd에 생성될 수 있다(Method Area는 논리적으로 Heap에 포함).
  • 더 구체적으로는 Heap의 PermGen이라는 영역인데, Java 8 이후로는 Metaspace라는 OS가 관리하는 영역으로 옮겨지게 된다.

실행 엔진

  • 클래스 로더에 의해 JVM으로 로드된 .class 파일들은 Method Area에 배치, 이후
    JVM은 바이트 코드를 실행 엔진에 제공하여, 정의된 내용대로 코드를 실행
    이때 로드된 바이트코드를 실행하는 런타임 모듈이 실행 엔진이다.
  • 바이트 코드를 명령어 단위로 읽어서 실행

JIT

JIT컴파일 또는 동적 번역은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법

전통적인 입장에서 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데, 인터프리트 방식과 정적 컴파일 방식으로 나눈다.
인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행한다. 반면 정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역한다.

  • JIT 컴파일러는 두가지의 방식을 혼합한 방식이다.
  • 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
  • 최근 자바 가상 머신과 .NET, V8(node.js)에서는 JIT 컴파일을 지원. 즉 자바 컴파일러가 코드를 바이트 코드로 변환한 다음, 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.

JIT 컴파일러

인터프리터의 단점을 보완하기 위해 도입된 방식으로 반복되는 코드를 발견하여 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후 해당 매서드를 더 이상 인터프리팅 하지 않고 캐싱해 두었다가 네이티브 코드(C,C++,어셈블리어로 구성된 코드)로 직접 실행하는 방식.

  • 컴파일된 네이티브 코드를 실행하는 것이기 때문에 전체적인 실행 속도는 인터프리팅 방식보다 빠르다.
  • 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행하는 식이다.(비용 절감)

JNI

자바가 다른 언어로 만들어진 어플리케이션과 상호 작용할 수 있는 인터페이를 제공하는 프로그램

Native Method Library

c ,c++ 로 작성된 라이브러러
만일 헤더가 필요하면 JNI는 이 라이브러리를 로딩해 실행한다.

JDK(Java Development Kit)

  • 자바 개발키트(Java Development Kit)의 약자로 이름 그대로 개발자들이 자바로 개발하기 위한 도구
  • JDK 안에는 개발 시 필요한 라이브러리들과 javac,javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE도 함께 포함되어 있다.

JRE(Java Runtime Environment)

  • 자바 실행 환경의 약자로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 자바 가상 머신이 포함되어 있다.

JDK, JRE의 차이

  • JRE는 읽기 전용, JDK 읽기 / 쓰기 전용이라 생각
  • JRE는 실행환경이고, JDK 개발 도구

래퍼런스
https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편#자바_가상_머신jvm의_구조
https://namu.wiki/w/JDK
https://namu.wiki/w/JVM

profile
오늘도 성장중

0개의 댓글