JVM 이란 무엇일까

디하·2024년 6월 13일
4

bucket📦

목록 보기
7/10
post-thumbnail

JVM

"Java Virtual Machine(JVM)은 Java 프로그램을 실행하기 위한 가상 머신

JVM은 Java 소스 코드를 컴파일한 바이트코드를 해석하여 실행하며, 이 과정을 통해 Java 프로그램이 다양한 플랫폼에서 동일하게 실행될 수 있도록 한다. 그래서 OS에 종속 되지않고 플랫폼 독립성을 확보 할 수 있다.


JVM의 구조

1. 클래스 로더(Class Loader):

자바 클래스 파일을 로드하고, 링크 및 초기화한다
동적으로 필요한 클래스를 로드하여 메모리에 적재한다

2. 실행 엔진(Execution Engine):

  • 인터프리터(Interpreter) :
    바이트코드를 실제 머신 코드로 변환하여 실행

  • JIT 컴파일러(Just-in-Time) :
    바이트코드를 런타임에 최적화된 네이티브 코드(기계어)로 변환

  • 가비지 컬렉터(Garbage Collector):
    사용되지 않는 객체를 자동으로 제거하여 메모리를 회수
    개발자가 메모리 관리에 신경 쓰지 않아도 되도록 도와준다

3. 메모리 영역:

  • 힙(Heap):
    - 모든 객체와 배열이 저장되는 영역
    - 동적으로 할당된 메모리 공간, 런타임 시 객체가 생성되면 힙 영역에 저장
    - 모든 스레드가 공유하는 영역
    - 힙 영역은 가비지 컬렉션의 주요 대상 , 사용되지 않는 객체를 자동으로 회수하여 메모리 누수를 방지
  • 스택(Stack):
    - 각 스레드마다 하나씩 존재, 메서드 호출 시 스택 프레임이 생성되어 메서드 호출과 관련된 지역 변수, 매개변수, 리턴 주소 등이 저장
    - 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면, 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
    - 각 스레드는 자신만의 스택을 가지고 있으며, 다른 스레드와 공유되지 않는다.

    스레드(thread) :프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미
    모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
    두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.

  • 메소드(Method Area):
    - 모든 클래스 레벨의 데이터가 저장되는 영역, 클래스 구조, 메서드 정보, 필드 정보, 상수 풀, 정적변수 등이 포함
    - JVM이 클래스를 로드할 때 이 영역에 클래스 정보를 저장
    - 모든 스레드가 공유하는 영역

  • PC Registers:
    - 각 스레드마다 하나씩 존재하며, 현재 실행 중인 명령의 주소를 저장
    - 현재 실행 중인 명령을 추적
    - 각 스레드는 자신만의 PC 레지스터를 가지고 있다

  • Native Method Stack:
    - 네이티브 메서드의 호출을 지원
    - 네이티브 메서드의 실행을 지원한다. 각 스레드는 자신만의 네이티브 메소드 스택을 가지고 있다.

바이트 코드 : 고수준 프로그래밍 언어로 작성된 소스 코드를 컴파일한 중간 단계의 코드
네이티브 코드 : 특정 하드웨어와 운영체제에서 직접 실행될 수 있는 기계어 코드

< static 과 nonstatic 멤버들의 메모리 접근방법 >
1. static 멤버들은 실행될때 자동으로 메모리에 로딩이 된다.

  1. NonStatic 메소드는 객체를 생성해서 메모리에 로딩 시켜야한다

코드에서 보면 static void main ()은 static 메서드여서 프로그램이 실행될때 자동으로 method area에 할당이된다.

하지만 non static인 int hap() 는 자동으로 메모리에 할당이 되지 않기 때문에 객체를 생성하여 메모리에 로딩 시켜줘야한다.

그게 바로 코드에서 보면
NoneStaticTest st = new NoneStaticTest();
으로 객체를 생성해준다.

그렇게 되면 힙 영역에 객체가 생성되어 메모리 공간이 생긴다 이 힙 영역에 생긴 hap는
메서드영역에 의 hap()을 가르킨다.

int sum = st.hap(a, b);
그리고 st.hap()로 콜을 하게 되면 스택영역에 있는 main() 에서 st -> 힙영역 hap를 참조하게 된다.

그리고 System.out.println(sum);
으로 모든 main() 메서드의 코드 실행이 끝나면 스택 영역에서 제거된다
자동으로 메모리에서 제거된다는 뜻이다

하지만, 여기서 힙영역에는 여전히 데이커가 메모리에 상주하게 된다

여기서 가비지 컬렉터가 힙영역을 청소하게 된다.
힙영역을 쭉 살피고 참조되지 않고 남아버린 고아 객체들을 식별해 힙 영역을 청소해준다
그리고 코드 실행이 모두 끝나면, 메서드 영역도 비워지게 된다.


JVM의 중요 역할

1. 바이트코드 실행:

자바 소스 파일(.java)은 자바 컴파일러(javac)에 의해 바이트코드(.class)로 변환
JVM은 이 바이트코드를 읽고 실행
바이트코드는 플랫폼에 독립적인 중간 형태의 코드로, 다양한 운영체제에서 동일하게 실행될 수 있다

2. 메모리 관리:

JVM은 메모리 할당과 가비지 컬렉션을 통해 메모리를 효율적으로 관리

3. 안전성 보장:

JVM은 바이트코드를 검증하고 애플리케이션이 악의적이거나 잘못된 동작을 하지 않도록 보장 이자바 애플리케이션의 안정성과 보안성이 향상된다

4. 플랫폼 독립성 제공:

한 번 작성된 자바 애플리케이션은 JVM이 설치된 모든 환경에서 실행될 수 있습니다.


참고 :
JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...)
그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

profile
🖥️ ⌨️🖱️🩵

0개의 댓글

관련 채용 정보