JuBin's personal study blog

[JVM] JVM의 Memory영역 ( Stack & Heap&Static ) 본문

JAVA

[JVM] JVM의 Memory영역 ( Stack & Heap&Static )

JuBin 2020. 11. 10. 19:50
반응형

JVM의 메모리구조

출처 : itmining.tistory.com/21

Stack 영역

  • Heap영역에 생성된 Object값의 참조값들을 할당
  • 크기가 정해져있다. ex) int는 4byte
  • 원시타입(byte, short, int, long, double, float, boolean, char)값들의 데이터들이 할당(참조값 X, 실제값 저장)
  • 메소드가 호출될때 메모리에 할당되고, 종료되면 메모리에서 해제
  • LIFO(Last In First Out)구조
  • Thread당 하나의 Stack영역 생성(Thread간 공유 불가능)
  • 여는 중괄호 '{'를 만날 때 마다 스택 프레임이 하나씩 생기고, 닫는 중괄호 '}'를 만나게 되면 스택 프레임이 사라집니다. 그러므로 메소드가 실행될 뿐 만 아니라, if문, 반복문, 예외처리를 위한 try문 등도 모두 스택프레임이 생기게 됩니다.
  • stack 내부에서 선언된 지역변수는 stack 영역에 올라갑니다.
  • 쓰레드도 stack 영역에 생기게 됩니다. 하나의 쓰레드는 내부적으로 별개의 T메모리 구조 static, stack, heap영역을 갖게 됩니다. 이런 이유로 하나의 쓰레드는 다른 쓰레드로 접근 할 수 없지만, static 영역과 heap 영역은 공유해서 사용 할 수있는 특징을 가지게 됩니다. (이런 특징이 멀티 프로레스 구조보다 멀티 쓰레드 구조가 메모리를 적게 사용 할 수 있는 이유입니다.)

 

Heap 영역

  • 생성된 객체(인스턴스)들이 올라간다
  • 애플리케이션의 모든 메모리 중 stack 에 있는 데이터를 제외한 대부분이라고 보면 된다.
  • 모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.
  • 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.
  • Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 Stack에 올라가게 된다

 

Static 영역(Method 영역이라고도 불림)

  • 패키지클래스 정보가 올라갑니다. 
  • 패키지나 클래스는 프로그램 시작과 동시에 모두 올라가는 것이 아니라, 실제로 호출 될 때 올라가게 됩니다. (JVM은 영리합니다.)
  • static이라는 키워드를 붙여서 선언된 필드와 메소드인 '클래스 멤버'도 static 영역에 올라갑니다. static 영역에 있는 것은 어떤 곳에서나 접근이 가능해지기 떄문에 '전역'이라는 키워드를 사용합니다.(정적변수(static)전역변수가 저장되는 공간이다)
  • 그러므로, static (전역) 변수는 읽기 전용이 아닌 경우에는 가능한 사용하지 말아야 합니다. (누구나 접근해서 값을 수정하면 혼란을 가져 올 수 있기 때문)
  • class영역 혹은 method 영역 이라고도 불립니다.
  • static 영역에 자리잡게되면 JVM이 종료 될 때까지 사라지지 않고, 고정된(static) 상태로 유지됩니다.
  • JVM당 단 하나의 영역이며, 공유 자원이다.

 




반응형

'JAVA' 카테고리의 다른 글

Maven Wrapper란(mvnw)  (0) 2021.01.05
[Java] ObjectMapper란  (0) 2020.12.23
서버 기반 인증 -> token 기반 인증  (0) 2020.10.31
자바1.8 Stream API 정리  (0) 2020.09.20
[JAVA 8] 자바1.8 Optional이란?  (0) 2020.09.20