[자바/JAVA] 메모리사용영역(JVM) : 메모리 사용영역이란? , null은 어디에 저장될까?

박정현·2023년 6월 15일
0
post-thumbnail

기본타입과 참조형타입을 비교할 때 각 메모리에 저장되는 위치가 다르다고 설명하면서 메모리사용영역에 대해 언급했었다. 메모리사용영역에 대해 더 자세히 알아보자.

자바를 실행하면 JVM(Java Vitrual Machine)은 운영체제로부터 메모리를 할당받는데 이 메모리를 메소드 영역, 힙 영역, 스택 영역으로 구분하여 사용한다.

🎨 메모리 영역을 그림으로 나타내면 다음과 같다.

1) 메소드 영역

  • 이 영역은 모든 스레드가 공유하는 영역이다.
  • 메소드 영역에는 컴파일 된 바이트코드(.class)들이 저장되는데 코드에서 사용되는 클래스들을 클래스로더로 읽어 클래스 별로 정적필드, 상수, 메소드 코드, 생성자코드 등을 분류해서 저장한다.

2) 힙 영역

  • 힙 영역에는 객체와 배열이 저장된다.
  • 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
  • 참조를 잃어버린 객체나 배열은 의미없는 객체가 되므로 쓰레기취급하고 (Garbage Collector를 실행시켜) 자동으로 제거된다.

3) 스택 영역

  • 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
  • 메소드를 호출할 때 프레임을 추가(push)하고 해당 프레임은 메소드가 종료될 때 제거(pop)하는 동작을 수행한다.
  • 프레임 내부에는 로컬변수스택이 있다.
    • 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다.
    • 초기화될 때 변수가 생성된다.
    • 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.

2. null은 어디에 저장될까?

참조타입 변수는 힙 영역에 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
❓ 그렇다면 null은 어디에 저장될까? 힙영역일까?

🙅 null값은 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택영역에 생성된다.

🙋‍♂️ 예제를 통해 확인해보자.

String ver1 = "Hello"
String ver2 =  null;

[ ver1 ]

  • String객체가 heap영역에 생성되고 변수는 그 객체의 번지는 스택영역에 저장된다.
  • ver1변수는 번지를 통해 객체를 참조할 수 있다.

[ ver2 ]

  • ver2: null로 초기화된 참조변수는 스택영역에 생성된다.
  • 참조변수가 null을 가지고 있을 경우에는 참조 객체가 없으므로 변수를 통해 객체를 사용할 수 없다.
    • 만약 존재하지 않은 객체의 데이터를 사용할 경우 예외(NullPointerException)가 발생한다.

❓ 그렇다면 원래 객체를 참조했던 변수가 null로 다시 초기화하면 원래 있던 객체는 어떻게 될까?

String ver1 = "Hello";
String ver1 = null;

  • 더 이상 ver1변수가 String객체를 참조하지 않아 참조를 잃은 객체는 쓰레기객체로 취급하여 쓰레기수집기(Garbage Collector)를 구동시켜 메모리에서 제거한다.

3. 요약

자바를 실행하면 JVM은 운영체제로부터 메모리를 할당받는데 이 메모리를 메소드 영역, 힙 영역, 스택 영역으로 구분하여 사용한다.

기본타입은 스택영역에 객체타입은 힙영역에 데이터가 저장된다,

null값은 객체를 참조하지 않는다는 뜻으로 null값으로 초기화된 참조 변수는 스택영역에 저장된다.

profile
개발을 개발괴발하지 않기 위한 노력

0개의 댓글

관련 채용 정보