자바 메모리 구조(Runtime Data Area)

이진호·2022년 8월 29일
0

JAVA

목록 보기
1/10
post-thumbnail

Runtime Data Area

Runtime Data Area

JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역. Run-Time Data Area 에는 크게 아래 5가지의 영역이 존재합니다.

Method Area

  • 인스턴스 생성을 위한 객체 구조, 생성자, 필드 등이 저장됩니다.
  • Runtime Constant Pool 과 static 변수, 그리고 메소드 데이터와 같은 Class 데이터들도 이곳에서 관리가 됩니다.
  • 이 영역은 JVM 당 하나씩만 생성이 됩니다.
  • 인스턴스 생성에 필요한 정보도 존재하기 때문에 JVM의 모든 Thread들이 Method Area을 공유하게 됩니다.
  • JVM의 다른 메모리 영역에서 해당 정보에 대한 요청이 오면, 실제 물리 메모리 주소로 변환해서 전달해줍니다.
  • JVM 구동 시작 시 생성이 되며, 종료 시까지 유지되는 공통 영역입니다.

Heap

  • 코드 실행을 위한 Java 로 구성된 객체 및 JRE 클래스들이 탑재됩니다.
  • 문자열에 대한 정보를 가진 String Pool 뿐만 아니라 실제 데이터를 가진 인스턴스, 배열 등이 저장됩니다.
  • 이 영역은 JVM 당 하나씩만 생성이 됩니다.
  • 해당 영역이 가진 데이터는 모든 Java Stack 영역에서 참조되어, Thread 간 공유가 됩니다.
  • Heap 영역이 가득 차게 되면 OutOfMemoryError 를 발생시키게 됩니다.
  • 참조되지 않는 인스턴스와 배열에 대한 정보가 발생할 수 있으며 GC의 주 대상이 됩니다.

Java의 GC(Garbage Collection)방법과 종류

  • 각 Thread 별로 메모리를 할당받는 Java Stack 영역과 달리 조금은 속도가 느린 점이 있습니다.
  • 모든 Thread 들이 해당 영역인 Heap 을 공유하여 Java 의 동시성 문제가 발생하게 됩니다. 각각의 Thread 메모리가 따로 관리되는 것과 달리 이 부분은 Thread 에 의해서 공유가 되기 때문에 Thread Safe 하지 않습니다.

Java의 동시성 이슈 - 내용 추가 필요.

Java Stacks

  • 각 Thread 별로 따로 할당되는 영역입니다.
  • Heap 메모리 영역보다 비교적 빠르다는 장점이 있습니다.
  • 각각의 Thread 별로 메모리를 따로 할당하기 때문에 동시성 문제에서 자유롭다는 점도 있습니다.
  • 각 Thread 들은 메소드를 호출할 때마다 Frame 이라는 단위를 추가(push)하게 됩니다.
  • 메소드가 마무리되며 결과를 반환하면 해당 Frame 은 Stack 으로부터 제거(pop)가 됩니다.
  • Frame 은 메소드에 대한 정보를 가지고 있는 Local Variable, Operand Stack 그리고 Constant Pool Reference로 구성이 되어 있습니다.
    • Local Variable은 메소드 안의 지역 변수들을 가지고 있습니다.
    • Operand Stack은 메소드 내 연산을 위해서, 바이트 코드 명령문들이 들어있는 공간입니다.
    • Constant Pool Reference는 Constant Pool 참조를 위한 공간입니다.
  • 이렇게 구성된 Java Stack은 메소드가 호출될 때마다 Frame이 쌓이게 됩니다.
  • Java Stack 영역이 가득 차게 되면 StackOverflowError 를 발생시키게 됩니다.
    • JVM 의 전체적인 메모리가 부족하면 OutOfMemoryError 가 발생하기도 합니다.

Frame 스택 구조 및 Heap 영역 참조 예시

class Person {
    private int id;
    private String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

public class Main {
    public static void main(String[] args) {
        int id = 1;
        String name = "whybe";
        Person person = null;
        person = buildPerson(id, name);
    }

    private static Person buildPerson(int id, String name) {
        return new Person(id, name);
    }
}

Frame 스택 구조 및 Heap 영역 참조 예시

Native Method Stacks

  • Java로 작성된 프로그램을 실행하면서, 순수하게 Java로 구성된 코드만을 사용할 수 없는 시스템의 자원이나 API가 존재합니다. 이런 다른 프로그래밍 언어로 작성된 메소드들을 Native Method라고 하는데, Native Method Stacks는 이런 Java로 작성되지 않은 메소드를 다루는 영역입니다.
  • C Stacks라고도 불리며 Java Stacks 영역과 비슷하게 메서드가 쌓이는 방식으로 동작합니다.

PC(Program Counter) Registers

  • Java에서 Thread는 각자의 메소드를 실행하게 됩니다. 이때 Thread 별로 동시에 실행하는 환경이 보장되어야 하므로 최근에 실행 한 명령어 주소값을 저장할 공간이 필요합니다. 이 부분을 PC Registers 영역이 관리하여 추적해주게 됩니다.
  • Thread들은 각각 자만의 PC Registers를 가지고 있습니다.
  • 실행했던 메소드가 네이티브하다면 undefined가 기록되며, 네이티브 하지 않다면, PC Registers는 JVM에서 사용된 명령의 주소값을 저장하게 됩니다.

출처

참조
JVM의 구조

0개의 댓글