[Java] JVM 기본 이론

bien·2025년 1월 16일
0

Java_Spring_Backend

목록 보기
3/10

JVM에 대해 이해하려면 CS이론 OS, Virtual Memory에 대해 알아야 한다.


JVM 기본이론

  • JVM
    • Process.
    • java.exe 파일을 실행시켜 그 위에서 내가 만든 프로그램이 실행되는 것.
    • 기본적인 의미는, Virtual Machine.

컴퓨터의 기본 구조

  1. (1) 하드웨어(Physical)
    • CPU (Machine): 기계어(Machine code)를 이해하고 실행
    • RAM, SSD 등의 물리적 저장장치
  2. 소프트웨어
    • (2) 애플리케이션 영역: 사용자 프로그램
    • (3) 시스템 소프트웨어 영역: 운영체제(OS)와 그 핵심인 커널

상단의 User 영역: 일반 프로세스들이 실행
하단의 Native 영역: OS와 H/W가 위치
CPU: 최하단에서 실제 머신 코드를 실행

네이티브 코드 개발의 이해

  1. 개발 언어와 실행
    • C/C++ 기반 개발
    • 네이티브 영역: OS와 H/W가 위치
    • 고급언어를 머신 코드로 직접 번역
    • CPU에서 직접 실행되는 구조
  2. 의존성 특징
    • 하드웨어 의존성
      • 물리적 시스템 자원에 직접 접근
      • 하드웨어 구조에 따른 코드 최적화 필요
    • 운영체제 의존성
      • OS 환경에 직접적 의존
      • 플랫폼 별 호환성 제약
        • Window용 코드를 Linux/Unix로 이식하는 것이 어려움
        • OS별 별도 개발 필요

(C/C++) 고급언어를 머신 코드로 직접 번역한다는 말의 의미

  • C/C++ 컴파일 과정
    • 소스코드가 직접 기계어로 변환되는 단일 단계 컴파일
// C/C++ 소스코드
int main() {
    int a = 10;
    return a;
}
↓ (컴파일)
// 직접 기계어로 변환
0101 0111 1000 0011...
  • Java 컴파일 과정
    • 2단계 컴파일 과정을 거침
      • 1단계: 소스코드 -> 바이트 코드(.class 파일)
      • 2단계: JVM이 바이트코드를 실행 시점에 기계어로 변환
// Java 소스코드
public class Main {
    public static void main(String[] args) {
        int a = 10;
    }
}(1차 컴파일)
// 바이트코드
iconst_10
istore_1
↓ (JVM 실행시점)
// 기계어로 변환
0101 0111 1000 0011...

Virtual Machine의 이해

  • Virtual(논리적) vs Physical(물리적)
    • Virtual = Logical : 소프트웨어적 구현
    • Physical : 실제 하드웨어
      • Machine은 CPU를 이야기하는데, 이를 하드웨어가 아니라 소프트웨어로 구현하면 Virtual Machine이 된다.
      • 컴퓨터, 즉 Machine인데, 이를 소프트웨어적으로 구현한 했다, 이걸 버츄얼 머신(Virtual Machie)이라고 한다.
        • 이 버추얼 머신이 인식할 수 있는 코드가 Java Byte Code이면, 이걸 JVM(Java Virtual Machine)이라고 한다.

JVM(Java Virtual Machine)

  1. 기본 개념
    • 자바 프로그램을 실행하기 위한 소프트웨어 기반 가상 컴퓨터
    • Java Byte Code를 실행하는 가상화된 런타임 환경
  2. 하드웨어 가상화
    • CPU, RAM, SSD를 소프트웨어적으로 구현
    • RAM과 SSD를 가상 메모리로 추상화 해 프로세스가 동작
    • 운영체제의 기능도 일부 제공

JVM의 이해는 운영체제론(OS)과 컴퓨터 구조론의 개념을 통합적으로 파악하고, 이를 C/C++로 구현하는 방식을 이해한다는 것을 의미한다.

네이티브 vs 매니지드 코드

  1. 프로그래밍 언어와 메모리 관리
    • 메모리 관리 방식은 언어의 핵심 특성을 결정
      • 설계 철학과 장단점의 근간
      • 실행 환경과 안정성에 직접적 영향
  2. 네이티브 코드의 특징 (C/C++)
    1. 실행 구조
      • 하드웨어에 직접 접근하여 실행
        • OS와 하드웨어의 구조에 맞춰 직접 기계어로 변환
    2. 위험 요소
      • OS 레벨의 치명적 오류 위험
        • 메모리 직접 제어로 인한 리스크
        • Access Violation 발생 가능
  3. 매니지드 코드의 특징 (Java)
    1. 실행구조
      • .java -> .class (ByteCode) 변환
      • JVM위에서 동작하는 유저모드 애플리케이션
    2. 안전성
      • 프로그램 오류가 JVM 범위로 격리
        • OS 영향도 최소화
        • 시스템 보안 강화
      • JNI(Java Native Interface) 외 OS에 직접적인 접근 불가
    3. 장점
      • 플랫폼 독립성 보장
        • Virtual Machine은 제조사마다 OS별로 만들어진다. 따라서 바이트코드로 변환이 가능하도록 자바코드만 잘 작성해주면 OS가 뭐가됐든 잘 작동하는 장점이 있다.
      • 안전한 메모리 관리
      • 시스템 보안 강화

Java, C++ 메모리 관리 차이

C++

  • 특징
    • 객체의 전체 생명주기를 개발자가 직접 관리
      • 메모리 할당 (new)
      • 메모리 해제 (delete)
      • 객체의 소유권 관리
  • 장단점
    • 장점
      • 가상 메모리 영역에 대한 완전한 통제 가능
      • 높은 자유도와 세밀한 메모리 제어
      • 직접적인 성능 최적화 가능
    • 단점
      • 메모리 관리 실수 시 심각한 문제 발생
        • 개발자가 모든 책임을 부담
        • 메모리 누수 위험

Java

  • 특징
    • JVM의 Garbage Collector(GC)가 메모리 관리
      • 참조되지 않는 객체 자동 회수
      • 개발자는 객체 소유권 없음
      • 메모리 해제를 신경 쓸 필요 없음
        • 뷔페 시스템과 유사: 음식(객체) 사용 후 그릇을 두면, 서빙 직원(GC)이 자동으로 치움
  • 제약사항
    • 메모리 관리를 GC를 통해 실행
      • 메모리 소유권 문제를 디테일하게 논할 수 없다.
      • 가상메모리 공간의 데이터를 GC가 통제하므로, 가상 메모리 주소를 GC를 통해서만 조회할 수 있다.
    • GC 오작동 시 문제 해결이 복잡
    • GC 동작 구조에 대한 이해가 필요

Reference

profile
Good Luck!

0개의 댓글