[정리] Java Virtual Machine이 궁금하니까 알아보자. (1)

Wook _·2023년 9월 5일
0

정리

목록 보기
4/13

Java Virtual Machine..

일명 "JVM" 이다.

자바를 배우고자 한다면 첫번째로 접하게 되기도 하며, 보통 자바 강의나 책 첫번째 파트에 항상 존재하는 녀석이다.

그렇다고 중요성이 와닿지도 않고,
이 녀석을 몰라도 코드만 짤줄 안다면 프로그램은 돌아가기 때문에 무심코 지나치게 되는 존재이기도 하다.

하지만 가장 먼저 나온다는 것은 가장 중요한 개념이기도 하니까, 만약 필자처럼 멋모를때 자바를 배우고 지금까지 JVM의 철자만 외우고 있는 사람이라면 이 참에 JVM에 대해 알아가보자.

시작!


1. JVM..? 내가 이걸 왜 알아야 하는데?

JVM을 알아야 할 이유가 없다면 공부할 필요가 없으니까..!

왜 JVM에 대해 알아야 하는지 혹은 알면 어떤것이 좋은지 간략하게 인지하고 가자.

왜 JVM을 알아야 하는가..?

바로 성능 때문이다.

그렇다. 최고의 효율을 뽑아내고 메모리 누수를 줄이기 위해 우리는 JVM을 알아야 한다.

메모리 효율성을 위해 메모리 구조를 알고, 이를 토대로 메모리 관리를 수행한다면 동일한 기능의 프로그램도 이에 따라 성능이 좌우된다.

소규모 프로젝트나 간단한 프로그램을 만드는 개발자는 JVM 메모리에 대해서 이해해야 할 필요성이 없을 수 있으나,

우리는 '개발' 이라는 행위로 밥벌어 먹을것이기 때문에 JVM 메모리 구조에 대한 학습을 통하여 메모리 누수를 방지하고 성능 짱짱인 프로그램 개발을 지향해야 한다.

하여 우리는 JVM을 배우는 것이다.


2. JVM! 뭐라고 설명해야 할까!

JVM은 Java Virtual Machine으로 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현된다.

JVM은 초기 Oak라는 언어를 실행하기 위해 만들어졌으며, Oak 언어는 나중에 Java로 이름이 변경되었다.

Java는 기존의 언어와의 호환성과 이식성을 강조하는 목표를 가지고 개발되었으며, JVM은 Java언어의 특성과 요구사항을 고려하고 Java의 실행을 위한 환경을 제공하기 위해 설계되었다.

JVM의 특성은 다음과 같다.

  • 스택 기반의 가상 머신
  • 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장
  • Garbage Collector 사용
  • 단일 상속 형태의 객체 지향 프로그래밍
  • 포인터 조작 제한

등이 있다.

간략하게 설명하자면

스택 기반의 가상 머신:
메소드 호출 및 데이터 저장을 위해 스택을 사용

플랫폼 독립성 보장:
코드를 한 번 작성하면 어떤 플랫폼에서든 실행 가능

Garbage Collector:
사용하지 않는 객체 관리

단일 상속 형태의 객체 지향 프로그래밍:
Java언어 내 다중 상속을 허용하지 않음.

포인터 조작 제한
Java는 메모리 관리와 보안을 강화하기 위해 포인터 조작을 제한한다.

와 같은 것들이다.


3. JVM의 구성은 어떻게 될까?

위에서 JVM에 대한 정의와 특성을 알아보았다.

그렇다면 JVM이 어떻게 구성되어 있는지를 확인하여 각 요소들이 어떤 역할을 하는지 확인해보자.

JVM 내에는 다양한 구성 요소들이 존재한다.

  • 클래스 로더(Class Loader)
  • 실행 엔진
    1. Interpreter
    2. JIT Complier
    3. Garbage Collector
  • 런타임 데이터 영역
    1. 메소드 영역
    2. 힙 영역
    3. PC Register
    4. 스택 영역
    5. 네이티브 메소드

등 다양해서 알아야 할 것들이 많지만 이번 포스트에서는 클래스 로더와 실행 엔진 중 Interpreter와 JIT Compiler에 대해서만 다룰 것이다.

이외의 다른 개념들은 따로 포스팅 할 계획이다.

때문에 빠르게 클래스 로더순으로 알아보자.

Class Loader

자바 클래스를 JVM으로 동적 로드 하는 자바 런타임 환경(JRE)의 일부이다.

JVM 내로 클래스 파일(*.class)을 동적으로 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

클래스 로더는 다음과 같은 주요 작업을 수행한다.

  • 로딩(Loading): 클래스 파일을 읽어 JVM이 이해할 수 있는 내부 데이터 구조로 변환한다.
  • 링킹(Linking): 로딩된 클래스의 바이너리 표현을 JVM의 메모리에 저장하고, 이 클래스와 다른 클래스 간의 연결을 수행한다. 또한 클래스 파일이 유효하고 안전한지 검증하는 작업, 클래스에 필요한 정적 변수들을 할당하고 초기화 하는 준비하는 작업, 클래스나 인터페이스의 심볼릭 참조를 실제 메모리에 잠조로 변환하는 작업이 포함된다.
  • 초기화(Initialization): 클래스의 초기화 블록과 정적 변수를 실행하고 초기화 한다. 이 단계는 클래스가 처음으로 사용되거나 정적 변수에 접근할 때 발생하며 한 번만 실행된다.

일반적으로 클래스들은 요청 시 한 차례만 로드된다.
자바 런타임 시스템은 클래스 로더 때문에 파일과 파일 시스템에 대해 알 필요가 없으며, 클래스 로더에 이를 위임한다.

실행 엔진(Execution Engine)
Class Loader에 의해 로드된 바이트 코드들은 각 메모리 중 Method Area에 배치되는데, 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진에 제공하여, 정의된 내용대로 바이트 코드를 실행한다. 이때 로드된 바이트 코드를 싱행하는 런타임 모듈이 실행엔진이며, 실행 엔진은 바이트 코드를 명령어 단위로 읽어서 실행한다.

Interpreter

프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 의미한다.

Interpreter는 소스 코드를 직접 실행하거나, 소스 코드를 효율적인 다른 중간 코드로 변환하고, 변환한 것을 바로 실행한다.

원시 코드를 기계어로 번역하는 컴파일러과 대비되며, 고급 언어로 작성된 원시코드 명령어들을 한번에 한 줄씩 읽어서 실행하는 프로그램이다.

JIT Compiler

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다.

Interpreter 방식의 단점을 보완하기 위해 도입되었으며,
Interpreter 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더 이상 Interpreter를 수행하지 않고 기계어로 직접 실행하는 방식이다.

컴파일된 코드(기계어)를 캐시에 보관하기 때문에 한 번 컴파일 된 코드는 빠르게 수행할 수 있게 된다.


4. JVM은 어떻게 OS에 독립적일까?

그렇다면 JVM이 어떻게 OS에 독립적일 수 있는지 알아야
"아! 이게 JVM이구나!" 라는 생각이 머리에 박히지 않을까.

그렇다면 JVM은 어떻게 OS에 독립적인지 알아보자.

1. JVM은 JRE가 설치되어 있어야 한다.

JRE는 자바 런타임 환경으로 Java 프로그랭을 실행하려면 해당 운영체제에 알맞는 JRE가 설치되어 있어야 한다. JRE는 JVM과 Java 클래스 라이브러리를 포함하며, JVM과 함께 Java 프로그램의 실행을 지원한다.

2. Java 프로그램은 JVM에서 실행된다.

JVM은 특정 운영체제애 설치된 다양한 구현이 존재하며, 각 구현은 해당 운영체제에 맞게 작성되어있다.. 이러한 JVM 구현은 바이트코드를 해당 운영체제에서 실행 가능한 기계어로 변환하므로, 프로그램이 어느 운영체제에서든 실행될 수 있다.

즉 Java는 OS에 종속적인 것이 아니지만 JVM은 OS에 종속적이다!

JVM을 사용하기 위해서는 JRE를 설치해야 한다.
JRE는 OS와 호환이 되는 것으로 설치를 해야 한다.
때문에 JRE는 OS에 종속적이므로 JRE 내 JVM은 OS에 종속적이다.

그와 별개로 Java 프로그램은 JVM만 있다면 어디서든 실행가능하니, OS에 독립적이다.

라고 정리가 가능하다.


JVM! 아직 알아야 할게 많지롱!

위에서 설명했듯이 JVM을 배워야 하는 이유는 메모리 관리를 위한 것이다.

하지만 아직 메모리에 관한 이야기를 하지 않았는데, 이번 포스트 외적의 내용들은 따로 구성하여 만들 예정이다.

다음과 같은 주제로 찾아올 것이다.

  • 자바 컴파일 과정
  • 자바 메모리 구조
  • Garbage Collector

그러니 다음 포스트에서 위의 내용에 대해 알아보고 이번 포스트는 여기서 마치도록 하겠다.

끝!


출처

https://coding-factory.tistory.com/827
https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0

profile
책상 위에 있는 춘식이 피규어가 귀엽다.

0개의 댓글