[Java] 7. JAVA 메모리(Stack, Heap)


Stack 메모리와 Heap 메모리 설명 포스팅이다. Runtime Data Area 설명 이후 하단에 정리되어 있다.



1. Runtime Data Area

Runtime Data Areas 는 JVM 이 Java Bytecode 를 실행하기 위해 사용되는 메모리 공간

jvm-s2



1.1. 메소드(Method) 영역

  • Method 영역은 JVM이 시작 될 때 생성되는 공간(바이트코드가 해당 영역에 저장)
  • 클래스 로더가 클래스 파일을 읽어오면서 클래스 정보를 파싱해서 Method Area에 저장
  • 클래스, 메서드, 정적변수, static 변수들이 저장되고 모든 스레드가 공유하는 영역


1.2. 힙(Heap) 영역

  • JVM을 시작할 때 생성되는 공간
    • 사용되지 않는 객체는 GC가 삭제
  • Reference Type(참조타입)의 참조변수(객체/배열)들이 저장
  • 동적으로 생성 된 인스턴스 객체가 저장되는 공간(new 객체 생성 연산자로 생성된 인스턴스 객체)
  • 클래스의 객체, 변수 등 모든 스레드가 공유하는 영역


1.3. 스택(Stack) 영역

  • 메서드 호출 시 생성(스레드별로 생성)
    • 메서드를 호출/종료 할 때 마다 push/pop
  • Primitive Type(원시타입)의 변수들이 저장
  • new 생성자를 통한 객체 변수가 저장되는 공간
  • 지역변수나 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역


1.4. PC Register

  • 스레드가 시작될 때 생성되며, 스레드의 명령어를 저장하는 공간이다. 즉, 현재 수행중인 JVM의 명령어 주소를 저장하는 공간이다.


1.5. Navtive Method Stack

  • JAVA가 아닌 다른 언어로 작성 된 코드를 위한 공간(C, C++)



2. Stack vs Heap 메모리 비교

StackHeap
Primitive Type(원시타입)의 변수들이 저장Reference Type(참조타입)참조변수(객체/배열)들이 저장
new 생성자를 통한 객체 변수가 저장되는 공간동적으로 생성 된 인스턴스 객체가 저장되는 공간
메서드를 호출/종료 할 때 마다 push/pop사용되지 않는 객체는 GC가 삭제


샘플코드

java-memory


Heap 영역에 저장 된 객체의 데이터 메모리 주소값을 name 참조변수에 할당해 Stack 메모리에 저장.


Reference Type 변수(객체/배열)들이 Stack에 저장되면 push/pop 발생으로 비효율적이기에 Stack 영역이 아닌 Heap 영역에 저장된다. Heap 영역에 메모리를 저장하고, 그 메모리를 참조하는 주소를 Stack 메모리에 저장하는 것이다.