본문 바로가기

PROGRAMMING/JAVA

[JAVA] 자바/JVM 메모리 구조

JVM Memory

  • Method Area / Static Area
    • 클래스 파일의 바이트 코드가 로드되는 곳
    • 메인 메소드를 호출함으로써 프로그램 시작을 하게 되는데 메인 메소드에서 사용하는 클래스/ Static변수가 이 영역에 올라온다.
    • 메소드 영역에 호출된 메소드를 가지고있는 .class 파일이 메모리에 올라와있어야 하는데
      이를 로드하는것이 클래스 로딩
    • 클래스 로딩을 위한 JVM의 로딩 과정
    • 모든 클래스 수준의 데이터가 저장되며, JVM당 하나의 영역만 존재한다.
  • Heap
    • 클래스의 인스턴스(흔히 new로 생성되는 객체)와 배열이 할당되는 영역
    • 메소드 영역에 로드 된 클래스만 생성이 가능
    • GC(Garbage Collector)가 참조되지 않는 메모리를 확인하고 제거한다.
    • Detail about Heap
      • Eden + Survivor 1, 2 를 합쳐서 Young Generation
        • Eden : new를 통해 새로 생성된 객체가 위치한다.
          정기적인 GC에서 살아남은 객체들은 Survivor로 이동된다.
        • S1 = from space, S2 = to space
          Eden에서 GC에서 살아남은 객체는 from space로 이동.
          GC가 끝나면 to와 from을 가리키는 포인터를 변경 (맞교환된다)
      • Old Generation 
          • 객체가 일정 횟수이상의 GC에서 살아남으면 to space에서 Old로 온다
          • 이 공간이 꽉차면 확장을 시도하는데, 이 과정에서 Full GC가 발생한다.
            • GC는 크게 Major GC, Minor GC가 있는데 Full GC = Major GC를 의미한다.
      • Permanent = Metaspace
        • Class Loader에 의해 로드된 클래스들이 저장된다.
        • Old와 마찬가지로 꽉자면 확장 시도 -> Full GC 발생 -> 확장 불가시 OOME발생
    • GC는 별도 포스팅 
  • JVM Language Stack
    • 각각의 스레드마다 개별의 스택영역이 존재한다.
    • 메소드가 호출 될 때마다 메소드 콜스택이  스택에 스택 프레임이라는 메모리를 쌓는다.
    • 모든 지역변수, 매개변수가 여기 저장되며, 이 영역은 쓰레드간 공유되지 않음으로 쓰레드 세이프 하다.
    • 간단하게 말하면, 메소드가 호출되면 그 메소드에 필요한 것들을 준비하고 호출이 끝나면 스택에서 제거한다.
    • 쓰레드가 허락 된 스택 용량보다 많은 계산을 필요로 하면 StackOverFlow 에러가 발생하고,
      실행 중인 쓰레드의 스택을 확장할 만큼의 충분한 메모리가 없거나 , 새 쓰레드에게 할당 할 메모리가 없는경우
      OutOfMemory 에러가 발생한다.
  • PC Register
    • 쓰레드가 어떠한 명령을 실행하게 될지에 대한 부분을 기록
  • Native Method Stack
    • 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
    • 자바 코드를 수행하다 JNI를 호출하게 되면 Stack에서 Native Stack으로 확장된다.
      • JNI(Java Native Interface) : JVM 위에서 실행 되는 자바코드가 하드웨어/OS 플랫폼에 종속된 프로그램
        그리고 C, C++, 어셈블리 같은 다른 언어들로 작성된 라이브러리들을 호출/호출되는것을 가능하게 하는 프레임워크
      • 자세한 설명은 추가 포스팅 예정

쓰레드 관점에서의 Runtime data areas

 

  • PC Register / Stack / Native Method Stack 은 쓰레드와 생명주기를 같이한다.
  • Heap / Method Area 는 전체 스레드가 공유하는 데이터 영역으로 JVM과 생명주기를 함께한다.

 

 

JVM Runtime

 

 

참조

자바와 JVM 메모리 구조

JVM 메모리 구조와 GC

JAVA HEAP