JVM 메모리 구조

조항주·2022년 4월 21일

study

목록 보기
2/20
post-thumbnail

JDK, JRE, JVM

JDK

Java Development Kit의 약자
Java 애플리케이션의 개발을 위한 툴 세트입니다.
JRE 및 기타 개발 도구로 구성됩니다. 이러한 개발 도구에는 컴파일러 (javac), 아카이버 (jar), 문서 생성기 (javadoc) 등이 포함됩니다. 이러한 도구는 Java 응용 프로그램 개발을 완료하는 데 도움이 됩니다.

JRE

Java Runtime Environment의 약자
JRE는 컴퓨터의 운영체제 소프트웨어 상에서 실행되고 클래스 라이브러리 및 특정 Java 프로그램이 실행해야 하는 기타 리소스를 제공하는 소프트웨어 계층입니다.
JRE는 JDK를 사용하여 작성된 Java 코드를 JVM에서 이의 실행에 필요한 필수 라이브러리와 결합한 후 결과 프로그램을 실행하는 JVM의 인스턴스를 작성합니다. JVM은 다수의 운영체제에 사용 가능하며, JRE를 사용하여 작성된 프로그램이 이 모든 운영체제에서 실행됩니다. 이러한 방식으로, JRE(Java Runtime Environment)는 수정 없이도 어떤 운영체제에서든 Java 프로그램을 실행할 수 있도록 합니다.

JVM

JVM이란 JAVA Virtual Machine의 약자 (가상머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것)
자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다

JAVA 실행 과정


1. 작성한 자바소스, 즉 확장자가 .java인 파일을 자바 컴파일러를 통해 자바 바이트 코드로 컴파일한다.
2. 컴파일된 바이트코드를 JVM의 클래스로더에게 전달한다
3. 클래스로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역, JVM의 메모리에 올린다.
4. 실행엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

Class Loader

JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.

Execution Engine

클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다.

Runtime Data Area

JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.

Method Area

모든 쓰레드가 공유하는 메모리 영역입니다. 클래스, 인터페이스, 메서드 등 클래스의 데이터를 저장, 클래스 변수도 여기 저장합니다.

Heap area

new 키워드로 생성된 객체(인스턴스 변수)와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.

call statck

메서드의 작업에 필요한 메모리 공간을 제공합니다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용됩니다.
각 메서드를 위한 메모리상의 작업공간이 서로 구별되며, 첫번째로 호출된 메서드를 위한 작업공간이 호출스택의 맨 밑에 마련되고 그 위에 계속 쌓입니다.

package com.company;

public class Main {
    static void firstMethod(){
        System.out.println("firstMethod 시작");
        secondMethod();
        System.out.println("firstMethod 끝");
    }
    static void secondMethod(){
        System.out.println("secondMethod 시작");
        System.out.println("secondMethod 끝");
    }
    public static void main(String[] args) {
        System.out.println("main 시작");
        firstMethod();
        System.out.println("main 끝");
    }
}
//    main 시작
//    firstMethod 시작
//    secondMethod 시작
//    secondMethod 끝
//    firstMethod 끝
//    main 끝

0개의 댓글