PS, 언어 공부/JAVA

[JAVA] JVM 구조 및 작동원리

Emil :) 2022. 10. 29. 18:33
728x90
반응형

목차

이 글은 Notion에서 작성 후 재편집한 포스트입니다.


서론


자바는 JVM(Java Virtual Machine)을 이용해 프로그램이 실행됩니다.
자바 개발자라면 JVM의 작동원리를 명확히 인지하고 있어야, 프로그램 설계 시 좀 더 명확하고 섬세한 프로그램 명세가 가능하다고 생각합니다.

워낙 기본적인 내용이지만, 깊게 파고들수록 끝도 없는 영역입니다. 최대한 이해하기 쉬운 언어들로 구성하여 설명해드리도록 하겠습니다.

본 포스팅에선 JVM의 구조와, 작동원리에 대해 작성하고자 합니다.

참고


https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0

 

자바 가상 머신 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 자바 가상 머신 사양의 자바 SE 7 에디션에 기반을 둔 자바 가상 머신(JVM) 아키텍처의 개요도. 자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실

ko.wikipedia.org

https://onlyfor-me-blog.tistory.com/385

 

[JAVA] JVM의 작동원리

자바라는 프로그래밍 언어는 어떤 플랫폼에서든 소스코드 변경이 없어도 실행할 수 있다. 즉 어떤 CPU나 OS에서든 실행할 수 있단 뜻이다. 그래서인지는 몰라도 웹 어플리케이션 개발에도 사용되

onlyfor-me-blog.tistory.com

https://velog.io/@jihoson94/JVM-Java-virtual-Machine

 

JVM (Java virtual Machine)

JVM 이란?JVM 구성 요소Referencehttps://dzone.com/articles/jvm-architecture-explainedJava Virtual Machine 은 자바 바이트코드(.class)을 실행하는 프로그램입니다. 즉, 자바 프로그램이

velog.io

 

본론


JVM이란?


JVM은 자바 바이트코드를 실행할 수 있는 주체입니다.

자바의 실행방식을 간단히 말하자면 다음과 같습니다.
  1. 자바 컴파일러가 자바 코드를 바이트코드화 시킵니다.
  2. JVM의 클래스로더가 바이트코드화된 자바코드를 동적할당을 통해 JVM의 메모리영역에 올립니다.
  3. JVM의 실행엔진을 통해 자바 프로그램이 실행되며, JVM의 런타임 데이터 영역에 따라 실질적인 업무를 수행하게 됩니다.

이렇듯, 자바의 실행원리를 제대로 파악하기 위해선 JVM의 정의를 명확히 알아두는 것이 좋습니다.

 

JVM의 구조와 동작원리


JVM의 구조는 다음과 같습니다.

출처 : https://velog.io/@jihoson94/JVM-Java-virtual-Machine

크게 5가지 영역으로 나뉘어져 있습니다.

  • 클래스로더(Class Loader)
  • 런타임 데이터 영역(Runtime Data Area)
  • 실행엔진 (Execution Engine)
  • 자바 네이티브 인터페이스(Java Native Interface)
  • 네이티브 메소드 라이브러리(Native Method Library)

클래스로더

동적할당으로 JVM의 메모리 영역(런타임 데이터 영역)에 올려주는 역할을 합니다.
클래스를 메모리에 올리는 동적 클래스 로딩 기능은 클래스로더에 의해 이루어집니다.

3가지 단계로 구성되어 있습니다.

  1. Loading(로딩)
    1. 모든 클래스들이 하나의 클래스 로더에 의해 로딩되지 않습니다. 클래스의 종류와 경로에 따라 어떤 클래스로더에 의해 로딩될지 결정됩니다. 만약 이 단계에서 클래스가 발생되지 않는다면 ClassNotFoundException이 발생합니다. 이는 자바의 대표적인 Exception중 하나인 CheckedException이며, CheckedException에 대한 내용도 알아두면 좋습니다.
  2. Linking(링킹)
    1. Verify : 생성된 자바 바이트코드를 검증합니다.
    2. Perpare : 모든 static 변수 메모리가 할당되고, default 값들이 할당됩니다.
    3. Resolve : 모든 symbolic memory reference가 Method Area에 있는 original references로 대체됩니다.
  3. Initialization(초기화)
    1. 클래스 로딩의 마지막 단계입니다. 모든 static 변수들이 original 값들로 할당되고 static block을 실행합니다.

런타임 데이터 영역

메모리에 올라와있는 자바 프로그램으로, 4개 구성요소로 이루어져 있습니다.

  • Method Area(메소드 영역) : 클래스 수준의 오브젝트들이 할당됩니다. 객체 생성 후, 메서드를 실행하게 되면 메타데이터를 이곳에 저장하게 됩니다.
  • Heap Area(힙 영역) : 동적할당된 오브젝트와 배열들이 할당되는 영역입니다. GC의 대상 영역이며, 여러 스레드들간의 공유되는 메모리이기 때문에 Thread-safe 하지 않습니다.
  • Stack Area(스택 영역) : 지역변수, 파라미터 등이 생성되는 지역으로, 각각의 스레드를 위해 분리된 런타임 스택이 생성됩니다. 메소드 호출마다 Stack frame(스레드가 수행하고 있는 응용 프로그램을 메소드 단위로 기록하는 곳)을 Stack에 push합니다.
  • PC Register : 현재 실행중인 JVM 명령의 주소를 담고있습니다. 

실행엔진

자바 바이트 코드를 실행시키는 구간입니다. 크게 두 가지 방식으로 나뉩니다.

  • Interpreter : 바이트코드의 해석 속도가 빠르지만, 느리게 실행됩니다. 메소드가 여러번 호출될 때 매번 새로운 해석을 진행하기 때문입니다.
  • JIT Compiler : Interpreter 방식의 단점을 보완해주지만, 컴파일 과정때문에 초기 실행속도가 느리며, 용량을 많이 잡아먹습니다.

자바 네이티브 인터페이스(JNI)

C, C++, 어셈블리어로 작성된 함수를 사용할 수 있는 방법을 제공해줍니다.

네이티브 메서드 라이브러리(NML)

C, C++로 작성된 라이브러리입니다.

결론


JVM 안에서도 깊게 깊게 파고들어가면 굉장히 복잡한 영역 중 하나입니다. 간단하게 구조 및 동작원리에 대해 훑어보았고,

내부에서 어떤 동작이 이루어지는지, CS적인 접근은 다음 포스팅에서 좀 더 상세히 다뤄보도록 하겠습니다. 

구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡

728x90
반응형