[JAVA] JVM이란

동근이의 개발 일기·2024년 8월 14일

JAVA

목록 보기
1/18

Java를 공부하다보면 반드시 접하는 용어인 JVM에 대해 알아볼것이다.

JVM이란?

Java Virtual Machine

Java를 실행하기 위한 가상 컴퓨터라고 생각하면 된다.
특징으로 OS에 종속되지 않는다는 특징이 있다.

OS에 종속이 되지 않으니 OS위에서 Java를 실행시킬 수 있는 무언가가 있어야 하는데 JVM이 그 역활인것이다.

그렇기에 OS에 독립적이다 라는 장점을 가질 수 있다.

- Compile

위 그림을 보면 원시코드(*.java) 파일을 CPU가 바로 인식하지 못하고 기계어로 변환해주는 Compile이라는 과정을 거치는데
Java는 JVM 이라는 가상머신을 먼저 거쳐가기 때문에 JVM이 인식 가능한 Java Byte Code(*.class)로 먼저 변환을 해준다.

이후 OS가 해석 가능한 기계어(Binary Code)로 변환해준다.

- JVM


위 그림처럼 JVM을 뜯어보면 이러한 구조로 되어있다.

Java Source Code(.java file)Java CompilerJava Byte Code로 변환해주고 Class Loader로 들어간다.

Class Loader

Class Loader도 자세하게 살펴보자면 Loading, Linking, Initialization으로 나뉠 수 있고 하나하나 살펴보겠다.

Loading(로딩)

  • 자바 바이트 코드 (*.class)를 메소드 영역에 저장
  • 각 자바 바이트 코드 (*.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
    • 로드 된 클래스를 비롯한 그의 부모 클래스의 정보
    • 클래스 파일과 Class, Interface, Enum의 관련 여부
    • 변수나 메소드 등의 정보

Linking(링크)

  • Verify(검증) : 읽어드린 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.
  • Perpare(준비) : 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 Field, Method, Interface를 나타내는 데이터 구조를 준비한다.
  • Resolve(분석) : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.

Initialization(초기화)

  • 클래스 변수들 (static 변수)을 적절한 값으로 초기화한다. 즉, static 필드들이 설정된 값으로 초기화된다.

이렇게 각자 살펴보면 꽤나 복잡한 구조로 진행되는 것 같지만 그렇지 않다.

클래스로더로 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크해주는 역활을 한다.
이후 static 변수들을 적정한 값으로 초기화 해주는 과정이 Class Loader의 역활이다.

Execution

그 다음 실행 단계로 넘어가는데 이 Execution단계이다.

이곳에서도 크게 Interpreter, JIT Compiler, Garbage Collector로 나눌 수 있다.

Interpreter (인터프리터)

InterpreterCompiler와 비슷한 역활을 해준다.

Compiler는 Java의 원시코드를 기계어로 바꿔주는 역활이었다면
Interpreter는 한 줄씩, 한 명령어 단위로 읽어서 바로바로 실행해준다.

그리고 에러가 난다면 그 다음 명령어는 읽지 않아서 보안적 관점에서 유리하다.
다만 한 줄씩, 한 명령어 단위로 실행하기 때문에 속도는 Compiler보다 느리다.
이는 성능 저하를 뜻한다.

JIT Compiler (Just-In-Time)


JIT CompilerInterpreter의 성능 저하의 문제점을 해결하기 위해 나왔는데 Interpreter에서 한 줄씩 실시간으로 보내주면 바로 기계어로 변환시켜주는 작업을 하며 전체 코드의 필요한 부분만 실행된다.

그렇기에 Just-In-Time 인것이다.
기계어로 변환된 코드는 캐시로 저장이 되기 때문에 다시 컴파일 할 필요가 없다.

Garbage Collector (가비지 콜렉터)


직역하면 쓰레기 수집가인데
쉽게 말해 현재 더이상 사용되지 않는 메모리의 인스턴스를 삭제하는 역활이다.

왜 이런 과정을 거치는 것일까?
이유는 이러하다.

사용되지 않는 메모리 점유는 메모리 누수의 원인이기 때문이다.
메모리는 환경에 따라 다르겠지만 한정된 자원이고 필요하지 않는 메모리는 없애주는 것이 좋다.




이렇게 JVM에 대해서 알아보았고 구성 요소도 살펴보았는데 아직 JVM에 대해서 생각해볼 부분이 많다. 이는 다음 게시글에서 살펴보겠다.

profile
백엔드 개발자

0개의 댓글