매일 매일 미라클 코딩

[JAVA] 자바의 메모리 구조 - 스태틱 / 스택 / 힙 본문

BackEnd/JAVA

[JAVA] 자바의 메모리 구조 - 스태틱 / 스택 / 힙

뚜벅-뚜벅 2021. 6. 13. 01:25

Java의 메모리 영역은 크게 4가지로 나눌 수 있다

코드 영역(Code), T 메모리 구조라 불리는 스태틱(Static), 스택(Stack), 힙(Heap) 영역으로 구분된다.

 

static 영역 ( JVM 종료 시 소멸)

  • 개발자가 작성한 모든 클래스와 임포트 패키지 정보는 static 영역에 배치
  • static이라는 키워드를 붙여서 선언된 클래스 멤버도 static 영역
  • 메소드는 static 있든 없든 static 영역
  • 클래스나 메소드가 실제로 호출 될 때 올라가며 JVM이 종료될 때 까지 상주.
  • static 영역에 있는 것은 어떤 곳에서나 접근이 가능
  • static(전역) 변수는 읽기 전용이 아닌 경우에는 가능한 사용하지 않는게 좋다. 읽기전용 전역 상수 선언 추천.

 

 

stack 영역 (컴파일 시 작동)

  • 스택 프레임은 여는 중괄호를 만나면 스택 프레임이 생기며, 닫는 중괄호를 만나면 소멸
  • 따라서 main 메소드의 닫는 중괄호를 만나게 되면 스택 프레임은 소멸
  • main 메소드가 종료되면 JRE는 JVM을 종료하고 JRE 자체도 OS상의 메모리에서 사라짐 -> T 메모리도 끝
  • stack 내부에서 선언된 지역변수
  • 참조형 변수인 경우 heap의 객체를 가리키는 주소값만 저장
  • 쓰레드도 stack 영역 (쓰레드 내부에 Static, Stack, Heap 영역으로 또 나뉨)

 

 

heap 영역 (프로세스 종료시 소멸)

  • 더보기
    생성된 객체(인스턴스)들이 올라갑니다
  • 더보기
    인스턴스 필드들은 heap 영역에 올라갑니다
  • 더보기
    메소드들은 heap에 생기지 않음. 여러개 일 필요가 없기 때문.
  • 더보기
    stack영역에서 참조값을 이용해 heap 영역에 있는 인스턴스를 가르키면 제어 할 수 있게 되는 것
  • 더보기
    상속으로 인스턴스를 만들었다면 상위 클래스들의 인스턴스들도 같이 생성 (최상위인 Object까지)

 

 

참고

https://covenant.tistory.com/139?category=730169 

https://siyoon210.tistory.com/124