백엔드

JAVA와 JVM

skgur07 2024. 8. 12. 08:28

객체 지향 프로그래밍일명 OOP(Object-Oriented Programming) 이란 프로그램의 수많은 객체라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 여기서 객체란 ‘매소드, 변수’를 가지며, 특정 역할을 수행하도록 인간이 정의한, 추상적인 개념입니다.

객체 지향


객체 지향 프로그래밍의 4가지 주요 특징은 다양성, 상속, 캡슐화, 추상화입니다.

  • 다향성 ( Polymorphism ) :
  • 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미합니다.
  • 상속 ( Inheritance ) :
  • 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미합니다.
  • 추상화 ( Absration ) :
  • 불필요한 세부 사항을 숨기고, 중요한 정보만을 노출합니다. 이를 통해 복잡한 시스템을 단순화하고, 이해하기 쉽게 만듭니다.
  • 캡슐화 ( Encapsulation ):
  • 클래스의 내부 변수와 메소드를 하나로 패키징하는 특징입니다.

JVM


JVM ( Java Virtual Machine / 자바 가상 머신 ) 은 자바와 운영체제 사이에서 중재자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줍니다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다. JVM 은 자바 안에서만 사용하는 것이 아니라 코트린, 스칼라 등 의 언어에서도 JVM 동작 방식을 그대로 사용합니다.

 

JVM 은

JVM 방식

이런 식으로 작동합니다

  1. 자바 프로그램을 실행하면 JVM은 운영체제로부터 메모리를 할당 받습니다.
  2. 자바 컴파일러 ( javac ) 가 자바 소스코드 ( .java ) 를 바이트 코드 ( .class ) 로 컴파일 합니다.
  3. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크 하여 런타임 데이터 영역에 올립니다.
    1. 런타임 데이터 영역는 실직적인 메모리를 할당 받아 관리하는 영역입니다.
  4. 이 과정에서 실행엔진에 의해 가비지 콜렉터의 작동과 스레드가 동기화가 이루어집니다.

구성 요소


  • 클래스 로더
  • 실행 엔진
    • 인터프리터
    • JIT 컴파일러
    • 가비지 콜렉터
  • 런타임 데이터 영역
    • 메소드 영역
    • 힙 g영역
    • PC Register
    • 스택 영역
    • 네이티브 메소드
  • JNI - 네이티브 메소드 인터페이스
  • 네이티브 메소드 라이브러리

클래스 로더


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

즉, 로드된 바이트 코드 ( .class ) 들을 엮어서 JVM의 메모리 영역인 런타임 데이터 영역에 배치합니다.

실행 엔진


실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행합니다.

이 수행 과정에서 실행 엔진은 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행합니다.

인터프리터 :

바이트 코드 명령어를 하나씩 읽어서 해석하고 바로 실행합니다.

JIT 컴파일러 ( Just-In-Time Compiler ) :

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

가비지 컬렉터 :

자바 가상 머신은 카비지 컬렉터를 이용하여 Heap 메모리 영역에서 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.

 

런타임 데이터 영역


런타임 데이터 영역은 JVM의 메모리 영역으로 생각하면 쉽게 생각할 수 있다. 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.

여기에 속한

  • 메소드 영역
  • 힙영역
  • PC Register
  • 스택 영역
  • 네이티브 메소드

의 내용은 추후에 자세히 다루겠습니다.

JNI


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

JNI는 JVM이 Native Method를 적재하고 수행할 수 있도록 합니다.

  • 번외 : 실질적으로 제대로 동작하는 언어는 C, C++ 정도 밖에 없다고 합니다.

 

네이티브 메서드 라이브러리


C와 C++로 작성된 라이브러리를 칭합니다.

만일 헤더가 필요하면 JNI는 이 라이브러리를 로딩해 실행합니다.

'백엔드' 카테고리의 다른 글

서버리스  (0) 2024.12.10
JPA vs Mybatis  (0) 2024.11.25
런타임 데이터 영역  (0) 2024.08.14
의존성 주입!  (0) 2024.08.02
기능있는 주석 어노테이션이란 ?!?!!  (0) 2024.07.30