[Java]메모리 사용 영역

Wintering·2022년 5월 19일
0

이펙티브 자바

목록 보기
6/18

메모리 사용 영역

Runtime Data Area

java.exe로 JVM이 시작될 때, JVM이 프로그램을 수행하기 위해 OS로부터 할당받는 메모리 영역
(WAS의 성능에 문제가 발생하면, 대부분 이 영역들이 원인(Memory Leak , GC 등))
Rumtime Data Area는 5가지 영역으로 구분된다.
PC, JVM stack, Native Method Stack 영역은 Thread별로 각각 생성되고,
Heap, Method Area 영역은 모든 Thread가 공유한다.

PC Register

  • Java의 PC Register는 CPU 내의 기억장치인 레지스터와는 다르게 작동한다.
    (Register-Base가 아니라 Stack-base로 작동)
    현재 수행 중인 JVM Instruction의 주소를 가진다.

Native Method Stack

  • Java 외의 언어로 작성된 네이티브 코드들을 위한 stack
    (ex JNI를 통해 호출되는 C/C++ 등의 코드)
    (ex Thread.currentThread())

JVM stack

  • Thread의 Method가 호출될 때 수행할 정보(메소드 호출 주소, 매개 변수, 지역 변수, 연산 스택)가 Frame 이라는 단위로 JVM Stack에 저장된다.
    Method 호출이 종료될 때 stack 에서 제거된다.

  • JVM 스택 영역은 스레드가 시작될 때 할당된다.
    자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나다.

  • JVM 스택은 메소드를 호출할때마다 Frame을 추가하고(push), 메소드가 종료되면 해당 프레임을 제거(pop)한다.

  • 프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나, 제거 된다.
    변수가 이 영역에 생성되는 시점은 초기화 될 때, 즉 최초로 변수에 값이 저장될 때이다.
    변수는 선언된 블록안에서만 스택이 존재하고 블록을 벗어나면 스택에서 제거된다.

    🔻Example

    //1번
    char v1 = 'A';
    //2번
    if (v1 == 'A'){
    int v2 = 100;
    double v3 = 3.14;
    }
    //3번
    boolean v4 = true;

    선언된 변수들은 실행순서에 따라 다음과 같이 스택에서 생성되고 소멸한다.
    v2와 v3는 if 블록 내부가 실행되고 있을 때만 스택 영역에 존재하고, 실행 흐름이 if 블록을 빠져나가면 소멸

  • 기본 타입 변수는 스택 영역에 직접 값을 가지고,
    참조 타입 변수는 값이 아니라 힙 영역이나 메소드 영역의 객체 주소를 가진다.

Heap

  • 힙 영역은 객체와 배열이 생성되는 영역이다.
    힙 영역에 생성된 객체와 배열은ㅇ JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
    참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이것을 쓰레기로 취급하고 JVM의 GC를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거한다.

    Garbage Collection (GC)

    • JAVA객체의 특징
    1. 객체는 금방 접근 불가능(Unreachable) 상태가 된다.
    2. Old Generation에서 Young Generatio으로의 참조는 아주 적다.
      Heap의 인스턴스 중 Thread의 JVM Stack에 도달 할 수 없는 것(Unreachable)이 GC의 대상.
      도달할 수 있는 것들을 pick한 후, 그 나머지를 메모리에서 제거한다. = Mark and Sweep
      참조

Method Area

  • 메소드 영역에는 코드로 사용되는 클래스 (~.class)들을 클래스 로더로 일ㄺ어 클래스별로 런타임 상수풀 (Runtime Constant Pool), 필드(field), 데이터, 메소드(method) 데이터, 메소드 코드 생성자(constructor) 코드 등을 분류해서 저장한다.
  • 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.

0개의 댓글