[Java] Java와 JVM(Java Virtual Machine)

Jay Lee·2022년 12월 24일
0

Java

목록 보기
1/2

Java

Java의 특징

  • 캡슐화, 상속, 다형성이 잘 적용된 순수 객체지향 프로그래밍 언어이다.
  • 기본 자료형을 제외한 모든 요소들이 객체로 표현된다.
    장점
  • JVM(Java Virtual Machine) 위에서 동작하기 때문에 운영체제에 독립적이다.
  • Garbage Collector(GC)를 통한 자동 메모리 관리를 제공한다.
  • Java API 라이브러리들은 네트워크 및 분산처리와 관련된 기능을 쉽게 개발할 수 있도록 지원한다.
  • 동적 로딩(Dynamic Loading)을 지원함으로써 필요한 시점에 필요한 클래스만을 로딩하여 사용할 수 있다.
    단점
  • JVM 위에서 동작하기 때문에 캐싱이 되어있지 않은 상황에서 실행속도가 상대적으로 느리다.
  • 다중 상속이나 타입에 엄격하며 제약이 많다.

Java의 컴파일 과정

컴파일(Compile): 개발자가 작성한 소스코드를 컴퓨터가 이해할 수 있는 바이너리 코드로 변환하는 과정

  • Java의 경우 JVM에서 실행 가능한 바이트 코드 형태의 클래스 파일을 생성

  1. 개발자가 .java 파일을 작성
  2. .java 파일의 build를 진행
    • build: 소스코드 파일을 실행 가능한 형태의 SW로 만드는 일련의 과정
  3. 컴파일 진행 - java compiler의 javac의 명령어를 통해 바이트코드(.class) 생성
    • 이 때, 생성된 바이트 코드는 컴퓨터가 바로 읽을 수 없고 JVM만 읽을 수 있다
  4. Compile된 바이트 코드를 Class Loader를 통해 JVM내로 로드
  5. Class Loader가 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 (JVM의 메모리)에 올림.
  6. 실행 엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행

JVM(Java Virtual Machine)

JVM이란?

OS에 독립적으로 Java가 실행되기 위해서 OS위에 실행될 수 있도록하기 위해 Java Byte Code(.class)를 OS에 맞게 해석해주는 가상 컴퓨터이다. 각 OS에서 적절한 JVM만 설치하면 OS 상관없이 동일하게 바이트 코드가 동작하게 도와준다.

JVM의 구조

Class Loader

runtime 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 JVM 메모리(Runtime Data Areas)에 로드

Runtime Data Areas

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

  • PC Register
  • Java Virtual Machine Stack
  • Native Method Stack
  • Method Area: 모든 쓰레드가 공유하는 메모리 영역으로 class, interface, method, field, static 변수 등의 바이트 코드 등을 보관한다.
  • Heap: 프로그램 상에서 런타임시 동적으로 할당하여 사용하는 영역이다. instance 생성 시 Heap에 저장된다.

Execution Engine

Load된 Class의 ByteCode를 실제로 실행하는 Runtime Module. Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 실행되며, 실행 엔진은 명령어 단위로 읽어서 실행합니다.

profile
Data Engineer

0개의 댓글