자바 기본기 정리 6 - JVM (3)

유승선 ·2024년 1월 14일
0

자바 독학

목록 보기
9/10

이번 포스팅에서는 JVM의 런타임 데이터 영역 (Runtime Data Area) 대해 더 상세하게 작성하겠다. 참고 블로그, 많은 내용은 이곳에서 참고 했다.


런타임 데이터 영역은 JVM의 메모리 영역으로, 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 여역이다.

여기서, Method Area, Heap Area 는 모두 쓰레드 (Thread)가 공유 하는 영역이고, 나머지 Stack Area, PC Register, Native Method Stack 은 각 쓰레드 마다 생성되는 개별 영역이다.

더 자세하게 표현하면 아래와 같다.


메서드영역 (Method Area)

메서드 영역 은 JVM이 시작될때 생성되는 공간으로 바이트 코드 (.class) 를 처음 메모리 공간에 올릴때 초기화되는 대상을 저장하기 위한 메모리 공간이다. JVM이 동작할때 클래스가 로드되고, 프로그램이 종료될때까지 저장 된다.

TIP : 메서드 영역은 (Method Area) 는 Class Area 혹은 Static Area 로도 불린다.

모든 쓰레드가 공유하는 곳이라, 다음과 같이 초기화 코드 정보들이 저장되게 된다.

  1. Field Area : 멤버 변수의 이름, 데이터 타입, 접근 제어자의 정보
  2. Method Info : 메소드 이름, return 타입, 함수 매개변수, 접근 제어자의 정보
  3. Type Info : Class 인지 Interace 인지 여부 저장, Type의 속성, 등

Method Area에는 Runtime Contstant Pool 이란것이 존재하는데 아래와 같다.


힙 영역 (Heap Area)

힙 영역 은 메서드 영역과 함께 모든 쓰레드가 공유하며, JVM이 관리하는 영역이다.
한마디로, new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 Referenece Type이 저장 되는 곳이다.

당연히 Method Area영역에서 저장된 클래스만 생성이 되어 적재된다.

유의할점은, 힙 영역에 생성된 객체와 배열은 Reference Type 으로서, JVM 스택 영역의 변수나 다른 객체의 필드에서 참조된다는 점이다.

즉, 힙의 참조 주소는 "스택" 이 가지고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있는것이다

만일, 참조하려는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에, 이것을 쓰레기라고 생각하게 되고 JVM은 Garbage Collector을 실행시켜 쓰레기 객체를 힙영역에서 제거된다.

가비지 컬렉션의 작동 원리는 이후 포스팅에서 더 디테일하게 작성해보도록 하겠다.


스택 영역

스택 영역 은 int, long, boolean 등 기본 자료형을 생성할때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역 이다.

메서드 호출 시마다 각각의 스택 프레임 (그 메서드만을 위한 공간) 이 생성되고, 메서드 안에서 사용되는 값들을 정리하고 호출된 메서드의 매개변수, 지역변수, 리턴값 및 연산 시 일어나는 값들을 임시로 저장한다.

그리고 메서드 수행이 끝나면 프레임별로 삭제된다.

스택 프레임 (stack fream):

물론, 데이터의 타입에 따라서 스택 (stack) 과 힙(heap) 에 저장되는 방식은 다른다는것에 유의 해야한다.

  1. 기본 (원시) 타입 변수는 스택 영역에 직접 값을 가진다.
  2. 참조타입 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.

스택 영역은 각 스레드마다 하나씩 존재하며, 스레드가 시작될때 할당된다.
쓰레드를 종료하면 런타임 스택도 같이 사라진다.

좀 요약하자면, 메소드 영역은 클래스와 관련된 정보들이, 힙 영역은 new로 생성된 객체들이, 그리고 스택은 개별 쓰레드마다 생성되면 호출에 필요한 임시 변수나 참조 값들이 저장된다고 생각할 수 있다.


마무리:

여기까지 JVM의 내부 구조와 동작 원리에 대해 알아봤다. 내가 몰랐던 부분들이 훨씬 많았고 알면 알수록 너무 신기하고 더 알아가고 싶은 생각이 든다.

profile
성장하는 사람

0개의 댓글