Blog

[CS]07 JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?

Author
Summary
JVM의 스택과 힙메모리 영역?
Category
Study
Tags
CS
Favorite
Memory Date
2023/10/13
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?
JVM의 메모리 구조에는 주로 스택(Stack)과 힙(Heap)이라는 두 가지 주요 영역이 있습니다.
스택과 힙은 특히 자바에서 객체 지향 프로그래밍을 할 때 중요한 메모리 영역입니다.
스택(Stack) 메모리 영역은
메소드 호출과 관련된 지역 변수, 메소드 호출, 메소드가 종료될 때까지의 실행 정보 등을 저장하는 데 사용됩니다.
메소드가 호출될 때 해당 메소드의 실행부 내용은 스택에 생성되고, 이 프레임에는 메소드의 지역 변수, 매개변수, 복귀 주소 등이 저장됩니다. 메소드가 종료되면 해당 스택 프레임이 제거됩니다. 그 안의 저장된 내용도 모두 제거됩니다.
힙(Heap) 메모리 영역은
객체 인스턴스가 저장되는 영역으로, 동적으로 할당된 객체들의 정보가 여기에 저장됩니다.
new 키워드를 사용하여 객체를 생성할 때 힙에 메모리 공간이 할당됩니다. 객체가 더 이상 사용되지 않으면 가비지 컬렉터에 의해 제거되고, 해당 메모리 공간이 회수되면서 메모리 공간 을 확보하며 실행 환경을 관리합니다.
추가질문 객체 지향 프로그래밍에 중요하다했는데 어떤 관계가 있는가요?
객체 지향 프로그래밍에서는 클래스라는 설계도를 통한 객체를 사용하여 프로그램을 만드는것을 말합니다.
객체 지향 프로그래밍에서는 스택과 힙이 객체의 생성, 관리, 및 상호 작용을 지원하는 핵심적인 메모리 영역으로 사용됩니다.
클래스가 설계도라면 객체가 생성된 것은 인스턴스라고 불리우며 제품이라 볼 수 있습니다. 인스턴스는 주로 힙 메모리에 할당되고, 여러 인스턴스들의 관계나 인스턴스를 활용한 기능들인 메소드 들은 스택을 통해 제어됩니다.
추가질문 간단한 예시로 활용되는 상황을 알려주실수 있나요?
스택과 힙영역의 특징을 이용하면 객체의 내용을 변경하거나 저장하는데 활용할 수 있습니다. 또한 각 객체를 독립적으로 생성하여 별도로 관리 할 수도 있습니다.
우선 객체의 내용을 변경하는 경우,
예를들어 int[] arr = {1};에서 배열이 초기화되면 해당 실제 배열은 힙 메모리에 생성되고, arr이라는 참조 변수는 그 배열을 가리키는 주소값이 스택에 저장 됩니다. 1을 더하는 함수에 arr 참조변수명이 인자로 전달되고, 함수에서는 매개변수 arr로 받게 됩니다. 이 때 스택영역의 arr의 주소값이 복사되며 전달 됩니다. 이 말은 처음 초기화된 배열arr과 매개변수로 전달된 arr이 가리키는 힙의 실제 객체는 동일하여 함수에서 실제 배열의 값에 1을 더하도록 첫번째 인덱스에 1을 더하면 힙의 실제 객체 내 값이 변경된다는 것입니다. 이후 출력문으로 arr을 매개변수로 전달하면 또한 같은 실제 객체를 가리키므로 2로 변경된 값을 출력 할 수 있습니다.
추가적으로 객체를 독립적으로 생성하고자 할 경우,
int[] arr1 = {1};
int[] arr2 = {1};
처럼 두개의 배열을 생성한다면 첫번째 인덱스의 값을 조회하면 같은 1을 출력하는 같은 배열일 것으로 보일 수 있지만 전혀 관계없는 독립적인 객체입니다. 실제로 arr1, arr2는 스택에 저장된 주소값이 다르며, 각 주소값이 가리키는 힙 영역의 실제 배열도 각각 다른 객체이기 때문입니다.
이 두가지를 통해서 프로그램에서 어떤 회원의 정보를 수정하거나, 다른 회원을 추가는 등의 상황을 만들 수 있습니다.
추가질문 코드나 예시로 설명이 가능할까요?
객체인 정수배열 arr이 생성될 때 메모리 영역에서의 모습을 설명드리면
int[] arr = {1};이라는 배열 생성 및 초기화 문장이 실행되면
스택(Stack) 메모리 영역에 arr이라는 참조 변수가 스택에 생성됩니다. 이 변수는 힙 영역에 위치한 배열 객체를 가리키는 주소값을 가지고 있습니다.
힙(Heap) 메모리 영역에는 arr이 가리키는 실제 배열 객체가 힙에 생성됩니다. 이 배열은 길이가 1인 정수 배열이며, 초기값으로 1을 가진 상태로 저장되어 있습니다.
만약 출력문으로 단순히 변수명 arr의 값을 조회하는 프린트문이라면, 스택에 저장된 값인 arr의 주소값을 보여주게 됩니다.
만약 arr의 첫번째 인덱스의 값을 조회하는 프린트문이 실행된다면, 우선 스택에 저장된 arr이라는 변수명을 따라 가서 주소값을 보게 됩니다. 그 다음 주소값이 가리키는 힙 영역의 실제 객체들을 보게되며, 첫번째 인덱스를 호출 했으므로 객체의 인덱스가 0번째로 저장되있는 1이란 값을 가져오게 됩니다. 이후 1이라는 값을 출력문에 따라 콘솔화면에 출력하게 됩니다.