코딩기록

자바 메모리 영역 Stack, Heap, Static 본문

백엔드/JAVA

자바 메모리 영역 Stack, Heap, Static

빌럽스 2024. 2. 13. 09:08

1. Stack

  • 기본 자료형이 저장되는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
  • 메소드가 호출될 때 스택 영역에 스택프레임*이 생기고 그 안에 메소드를 호출한다.
    * 스택프레임: 하나의 메서드에 필요한 메모르 덩어리 / 하나의 메서드 당 하나의 스택프레임이 필요함 / 스택프레임에 쌓이는 데이터는 메서드의 매개변수, 지역변수, 리턴값 등이 있다. / 메서드 호출 범위가 종료되면 스택에서 제거
  • 메소드가 호출될 때 메모리에 할당되고, 메소드가 종료되면(= 메서드의 끝을 알리는 닫는 중괄호를 만나면) 메모리에서 사라진다.
  • 컴파일 타임 시 할당 된다.
  • 스택 메모리가 가득차면 자바에서는 java.lang.StackOverFlowError를 발생

 

2. Heap

  • 침조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
  • new를 통해 인스턴스 객체를 생성했을 때, heap 영역에는 생성된 객체가 올라가고, Stack 영역에는 해당 객체에 대한 주소 값(Reference)이 저장
  • (Stack 영역과 다르게) Heap 영역에 저장되는 데이터는 호출이 끝나더라도 삭제되지 않고 유지된다.
  • 그러다 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 사라지게 된다.
  • (stack은 스레드 갯수마다 각각 생성되지만,) heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재
  • 힙 메모리가 가득차면 자바에서는 java.lang.OutOfMemoryError : Java Heap Space 에러를 발생

 

3. Static

1) 공유 메모리 영역(또는 정적 메모리 영역)이라고 함
-> 프로그램 시작 시 static이 붙은 코드들이 모두 static영역에 생성되고,
 JVM이 종료될 때까지 사라지지 않음(정적)
 그리고, static 영역에 생성된 변수는 어디서든지 공유 가능(공유)

2) 호출방법 : 클래스명.변수명
static이 붙은 필드(변수) 호출 시에는 '클래스명.변수명'으로 사용함
=> Student.schoolName  ((인스턴스화 된) std1.schoolName : 권장 x)
static 변수는 어디서든 접근이 가능하기 때문에 가능한 무분별한 사용을 하지 않는 것이 좋음

 

 

 

'백엔드 > JAVA' 카테고리의 다른 글

JVM 정리  (0) 2024.10.27
JSP의 개념과 특징  (0) 2024.09.16
LocalDateTime format, pattern으로 변환하여 표현하기  (0) 2024.01.08