JVM 메모리 구조 (JVM Memory structure)



  • JAVA Source : 사용자가 작성한 JAVA 코드
  • JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜주는 기능
  • Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
  • Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
  • Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간


Runtime Data Area

Method Area

  • Method Area, Class Area, Code Area, Static Area 로 불리어짐
  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간
  • 클래스 파일의 바이트 코드가 로드되는 곳
  • 힙이 아닌 영역 (HotSpot JVM 구현에서)
  • 2개의 주요 공간으로 분리됨
    • Permanent Generation
      • 클래스 정의, 구조, 메소드, 필드, 메소드 (데이터 및 코드) 및 상수로부터 클래스 관련 데이터를 저장
      • -XX : PermSize 및 -XX : MaxPermSize를 사용하여 규제 될 수 있음
      • PermGen 공간이 부족하면 java.lang.OutOfMemoryError가 발생할 수 있음
    • Code Cache
      • 캐시 영역은 컴파일 된 코드를 저장하는 데 사용
      • 컴파일 된 코드는 원시 코드 (하드웨어 고유)일 뿐이며, Oracle HotSpot JVM에 고유 한 JIT (Just In Time) 컴파일러가 처리


Stack

  • Last In First Out (LIFO)
  • 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성
  • 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
  • 메서드 수행이 끝나면 프레임별로 삭제


Heap

  • new 연산자로 생성된 객체와 배열을 저장하는 공간
  • 클래스 영역에 로드된 클래스만 생성가능
  • Garbage Collector를 통해 메모리 반환
  • Permanent Generation : 생성된 객체들의 정보의 주소 값이 저장된 공간
  • New Area
    • Eden : 객체들이 최초로 생성되는 공간
    • Survivor : Eden에서 참조되는 객체들이 저장되는 공간
  • Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간


Native Method

  • JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택
  • 네이티브 메소드의 매개변수, 지역변수 등을 바이트 코드로 저장
  • 자바 외의 다른 언어에서 제공되는 메서드들이 저장되는 공간

PC Register

  • 현재 수행 중인 JVM 명령 주소를 갖음
  • 프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
  • CPU는 인스트럭션을 수행하는 동안 필요한 정보를 CPU 내 기억장치인 레지스터에 저장
  • 연산 결과값을 메모리에 전달하기 전 저장하는 CPU 내의 기억장치
  • Thread가 생성 될 때마다 생성되는 공간
  • Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록
  • 현재 실행되는 부분의 명령과 주소를 저장


JAVA8에서 JVM 메모리 모델 변경사항

Perm 영역이 없어지고 Metaspace 공간으로 변경

PermGen 관련 JVM 옵션 (예 : -XX : PermSize 및 -XX : MaxPermSize)는 이제 무시됨

  • Metaspcae
    • 네이티브 힙 메모리의 일부
    • -XX를 사용하여 조정 가능 MetaspaceSize 및 -XX : MaxMetaspaceSize
    • java.lang.OutOfMemoryError : 네이티브 공간이 고갈되면 메타 데이터 공간이 수신



Reference

[1] JVM PergmGen - Where art thou? (https://www.javacodegeeks.com/2014/09/jvm-permgen-where-art-thou.html)

[2] Java Garbage Collection (http://d2.naver.com/helloworld/1329)

[3] RUNTIME DATA AREA - JABVA'S MEMORY MODEL (http://www.pointsoftware.ch/en/under-the-hood-runtime-data-areas-javas-memory-model/)

[4] How Garbage Collection works in Java (http://javarevisited.blogspot.kr/2011/04/garbage-collection-in-java.html)

저작자 표시 비영리 변경 금지
신고

Leave a Comment


to Top