ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메모리 영역
    STUDY/백엔드 2021. 2. 8. 17:57

    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까지)

     

     

     

    참고 

    siyoon210.tistory.com/124

    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
Designed by Tistory.