[CS_study] JVM 이란 무엇인가?

JUN·2024년 11월 7일
0

CS

목록 보기
1/6
post-thumbnail

서론

CS 스터디를 시작했다. 기본부터 시작하는 CS 스터디... 알고 있다고 생각한 개념도 설명하려니 알고 있는게 아니었다는 생각이 들었다. 휘발되기전에 정리해두자.

High Level Programming Language 들의 실행 방식

세상에는 크게 두 종류의 프로그래밍 언어가 있다.
1. 인터프리터 언어 - Python

  • 장점:
    • 빠른 개발 및 디버깅
    • 시스템 이식성 좋음
  • 단점:
    • 상대적으로 느린 실행 속도
    • 소스 코드 노출 위험
  1. 컴파일러 언어 - C, JAVA
  • 장점:
    • 빠른 실행 속도
    • 코드 최적화 가능
    • 소스 코드 보호
  • 단점:
    • 긴 개발 및 테스트 시간
    • 플랫폼 종속성

하지만 Java는 단순한 컴파일러 언어가 아니다. Java는 코드를 바이트 코드로 변환하는 컴파일러와 JVM 실행 엔진 내의 인터프리터를 동시에 갖추고 있다.

JVM이란 무엇인가?

과거에는 윈도우에서 C 언어로 작성된 코드를 서버 컴퓨터나 다른 운영체제에서 실행하려면 각 운영체제에 맞는 기계어로 번역해주는 컴파일러가 필요했다. 이로 인해, “내 컴퓨터에서는 작동하지 않는데?“라는 문제가 빈번하게 발생했다.

이 문제를 해결하기 위해 Java는 컴파일러와 운영체제 사이에 JVM이라는 한층의 레이어를 추가했다.

  1. 기존 언어의 실행 방식:
  • 소스코드 → OS에 맞는 컴파일러 → 기계어 → 해당 OS에서 실행
  1. Java의 실행 방식:
  • 소스코드 → 컴파일러 → 바이트코드 → JVM → 해당 OS에서 실행

Java는 소스 코드를 바이트 코드로 컴파일한 후, JVM이 이 바이트 코드를 읽어 각 OS에서 실행될 수 있는 형태로 해석한다. JVM 덕분에 Java는 플랫폼 독립적인 실행 환경을 제공할 수 있다.

프로그램을 실행하기 위해 JVM이라는 가상 머신으로 각 OS위에 한층의 가상화를 쌓아서 플랫폼 독립적인 실행 환경을 제공한 것이다.

JVM의 주요 기능

  • 바이트코드 해석 및 실행: Java 컴파일러가 생성한 바이트코드를 해석하고, 각 OS에 맞는 기계어로 변환해 실행한다.
  • 메모리 관리: 힙(Heap)과 스택(Stack) 메모리를 관리하며, 가비지 컬렉터(GC)를 통해 불필요한 메모리를 해제한다.
  • 보안 및 로드: 프로그램을 안전하게 로드하고 실행하기 위한 보안 메커니즘을 제공한다.

그럼, 자바 말고 다른 언어는 JVM 위에 올릴 수 없나요?

자바뿐만 아니라 Kotlin, Groovy 등도 JVM 위에서 실행 가능하다. 이들 언어는 Java와 마찬가지로 바이트 코드로 컴파일되어 JVM에서 실행된다.

반대로 JVM 계열 언어를 일반적으로 컴파일해서 사용할 순 없나요?

가능할 것으로 생각된다. 만약 다른 프로그래밍 언어처럼 기계어 수준으로 일반적인 컴파일을 진행한다면, Java의 플랫폼 독립성과 동적 최적화의 장점을 잃게 되어 비효율적일 수 있다.

VM을 사용함으로써 얻을 수 있는 장점과 단점에 대해 설명해 주세요.

  • 장점:
    • 플랫폼 독립성: JVM 덕분에 Java 프로그램은 다양한 운영체제에서 동일하게 실행될 수 있다.
    • 메모리 관리: 가비지 컬렉터를 통해 개발자가 직접 메모리 해제 작업을 하지 않아도 된다.
  • 단점:
    • 성능 오버헤드: 가상 머신 위에서 실행되기 때문에 네이티브 언어에 비해 성능이 떨어질 수 있다.
    • 시작 시간: JVM 초기 구동 시간이 다소 길어질 수 있다.

JVM과 내부에서 실행되고 있는 프로그램은 부모 프로세스 - 자식 프로세스 관계를 갖고 있다고 봐도 무방한가요?

부모 프로세스 - 자식 프로세스 관계가 무엇인가?

운영체제의 프로세스 관계에서 부모 프로세스는 다른 프로세스를 생성하고, 자식 프로세스는 부모의 메모리와 환경을 복사하여 독립적으로 실행된다. (각각 고유한 메모리 공간과 PID를 가짐)

하지만 JVM은 운영체제 내에서 독립적인 프로세스로 실행되며, Java 프로그램은 JVM 프로세스 내부에서 스레드로 동작한다.
JVM이 실행하는 각 Java 프로그램의 스레드들은 동일한 메모리 공간(Heap)을 공유한다.
따라서 JVM과 프로그램은 프로세스-스레드 관계로, 부모-자식 프로세스 관계가 아니다.

profile
순간은 기록하고 반복은 단순화하자 🚀

0개의 댓글