메모리 구조_잡탕

2024. 1. 22. 00:01JAVA

자바의 메모리 영역은 크게

- 메서드(METHOD)

- 스택(STACK)

- 힙(HEAP) 영역으로 나눌 수 있다.

 

메서드 영역 : 클래스 정보를 보관한다. 

스택 영역 : 실제 프로그램이 실행되는 영역. 메서드를 실행할 때 마다 하나씩 쌓인다.

힙 영역 : 객체(인스턴스)와 배열이 생성되는 영역. new 키워드를 사용하면 이 힙(heap) 영역에 객체가 생성된다.

 

------ ? ? ? 

이렇게만 봐서는 모르겠다. 좀 더 깊이 들어가 보자.

 

메서드 영역 : 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.

 

- 클래스 정보 : 클래스의 실행 코드(바이트 코드), 멤버변수, 메서드, 생성자 코드 등 모든 실행 코드

- static 영역 : static(정적) 변수들을 보관한다. 

- 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다.

가령 개발자가 "banana" 라는 리터럴을 여기저기서 작성했다고 치자. 당연하게도 "banana" 라는 데이터가 여기 저기에 존재하게 된다. 그런데.. 값이 변할 일 없이 계속해서 똑같이 존재한다면 "banana"가 여러 개 존재할 필요가 있을까? 그냥 하나로 묶어서 관리하면 안 되는건가? 그렇다. 리터럴을 하나로 묶어 관리하는 존재이다.

 

런타임 = 실행

상수 = 변하지 않는 값

풀 = 웅덩이

실행에 필요한 상수들을 한 데 모아 관리하는 것. 런타임 상수 풀이다.

이는 자바의 최적화 영역으로 지금은 이 정도만 살펴 보도록 하자.


Stack 영역

자바 실행 시, 하나의 스택이 생성된다.

각 스텍 프레임에는 지역 변수, 중간 연사 결과, 메서드 호출 정보 등을 포함한다.

스텍 프레임?

스택 영역에 쌓이는 네모 박스다. 메서드가 호출될 때 마다 하나의 스택 프레임이 스택 영역에 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거 된다.

 

to be next

스택 영역은 쓰레드 수 만큼 생성된다.

우리가 기존까지 해왔던 예제들은 전부 단일 쓰레드로, 스택도 1개 였다.

쓰레드가 뭐길래?

ㄴ 중요한 내용이라 추후 자세히 알아볼 계획이다.


힙 영역(Heap)

객체와 배열이 생성되는 영역이다. new 키워드와 생성자() 를 사용하면 해당 클래스의 인스턴스가 생성된다고 했다.

생성된 인스턴스가 저장되는 영역인 것이다. 또한 힙 영역은 가비지 컬렉션의 활동 무대이기도 하다. 

가비지 컬렉션은 더 이상 참조해주는 대상이 없는 객체를 제거하여 메모리를 회수한다.

 


메서드 영역

메서드 영역에서는 클래스 정보를 보관 한다고 했다.

클래스를 통해 만든 인스턴스를 ' 힙 영역' 에 저장 했으면 충분하지 않나 싶지만,

그렇게 할 경우 '비효율적인 비용 문제' 가 발생한다.

 

가령, Student 클래스가 있다고 치자. 

인스턴스는 필드(이름, 나이) , 행동(공부, 휴식)을 갖는다.

이런 상황에서 객체 100개를 생성했을 때,

필드값(이름, 나이) 등은 개별로 취급하는 것이 옳겠다.

행동(공부, 휴식)도 100개씩 개별 취급하는 것이 옳은가?

공부한다, 휴식한다는 행동은 인스턴스가 모두 공통으로 갖는데, 하나만 있으면 되지 않나?

인스턴스들이 갖고 있는 공통의 정보 = 클래스 정보

 

즉. 인스턴스 공통의 정보와 이를 갖고 있는 클래스 정보를 한 군데에서 관리하면 편하겠다.

이를 위해 메서드 영역이 존재한다.

 

메서드 영역에는 메서드 외 정적 변수, 상수, 메서드의 바이트 코드(공통 정보) 등도 저장된다.

'JAVA' 카테고리의 다른 글

static_static 변수  (0) 2024.01.22
자료구조_스택&큐  (0) 2024.01.22
접근제어자_default  (0) 2024.01.17
접근제어자_private  (0) 2024.01.17
접근제어자  (0) 2024.01.17