-
static 영역
- 패키지나 클래스 정보가 올라갑니다.
- import된 패키지를 static 영역에 배치한다.
- 프로그램 상의 모든 클래스를 static 영역에 배치한다.
- 필드 부분에서 선언된 변수(전역 변수)와 정적 멤버변수(static이 붙은)는 static 영역에 데이터가 저장된다. static 영역의 데이터는 프로그램의 시작부터 JVM이 종료가 될 때까지 메모리에 남아있게 된다. 따라서, 전역변수를 무분별하게 많이 사용하면 메모리가 부족할 우려가 있어 필요한 변수만 사용해야 한다.
- 또한, 전역변수는 읽기 전용이 아닌 경우에는 누구나 접근해서 값을 수정하면 혼란을 가져올 수 있기 때문에 가능한 사용하지 말아야 합니다.
- class영역 혹은 method 영역 이라고도 불립니다.
stack 영역
- 여는 중괄호 '{'를 만날 때 마다 스택 프레임이 하나씩 생기고, 닫는 중괄호 '}'를 만나게 되면 스택 프레임이 사라진다. 그러므로 메소드가 실행될 뿐 만 아니라, if문, 반복문, 예외처리를 위한 try문 등도 모두 스택프레임이 생기게된다.
- stack 내부에서 선언된 지역변수는 stack 영역에 올라갑니다.
- 기본형 타입 변수의 값들은 stack영역에 저장되고, 참조형 타입 변수는 참조값만 저장됩니다. (이 참조값은 heap 영역에 존재하는 인스턴스(객체)를 가르키는 역할을 한다.)
- 외부 스택 프레임에서는 내부 스택 프레임의 변수에 접근 하는 것은 불가능하나 그 역은 가능합니다. 쉽게 생각하면 메소드안에 for문 스택 프레임을 만든 경우, for문에서는 자신을 호출한 메소드의 변수는 사용가능하나, 메소드에서는 for문에서 선언한 변수를 사용 할 수 없습니다.
public class StackExample {
public static void main(String[] args) {
int a =5;
for(int i=0;i<5;i++){
System.out.println(a); // 외부 스택 프레임의 변수 a값에 접근 가능
}
// System.out.println(i); 컴파일 에러 -> 내부 스택 프레임(for문)의 변수 i에 접근 불가능
}
}- thread도 stack 영역에 생긴다. 하나의 쓰레드는 내부적으로 별개의 T메모리 구조 static, stack, heap영역을 갖게 됩니다. 이런 이유로 하나의 쓰레드는 다른 쓰레드로 접근 할 수 없지만, static 영역과 heap 영역은 공유해서 사용 할 수있는 특징을 가진다.
heap 영역
- 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등의 데이터가 저장된다.
- stack영역에서 참조값을 이용하여 참조형 변수가 heap 영역에 있는 인스턴스를 제어 할 수 있게 된다.
- 어떤 참조 변수도 힙영역에 있는 인스턴스를 참조하지 않게 된다면, GC(가비지 컬렉터)에 의해 메모리에서 사라지게 된다.
- 서버의 gc.log에는 가비지 컬렉터가 메모리를 비우는 동작이 작성된다. 만약 가비지 컬렉터에 의해 메모리가 비워지지 않으면 메모리가 나중에 최대치로 사용되서 문제가 발생할 수 있다. 그리고 사용자의 요청이 많아서 메모리가 엄청 쌓였다가 한 번에 비워주는 동작이 발생할 경우 비워지는 시간이 오래걸려서 셧다운이 발생할 수 있다.
- 상속을 이용한 인스턴스를 만들었다면 상위 클래스들의 인스턴스들도 같이 생성된다. (최상위인 Object까지)
참고
blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220954420688
'STUDY > 백엔드' 카테고리의 다른 글
Stream (0) 2021.04.28 Spring Batch (0) 2021.03.03 RestTemplate & WebClient (0) 2021.02.03 @Mock, @MockBean (0) 2021.02.03 @ControllerAdvice / @RestControllerAdvice (0) 2021.02.03 - 패키지나 클래스 정보가 올라갑니다.