스택/힙 메모리

김명래·2022년 9월 5일
0

OOP

목록 보기
3/4
post-thumbnail

JAVA의 Stack과 Heap

Stack

  • Heap 영역에 생성된 Object 타입의 데이터의 참조값이 할당된다.
  • 원시타입의 데이터가 값과 함께 할당된다.
  • 지역변수들은 scope 에 따른 visibility 를 가진다.
  • 각 Thread 는 자신만의 stack 을 가진다.

Stack 에는 heap 영역에 생성된 Object (참조자료형) 타입의 데이터들에 대한 참조를 위한 값들이 할당된다.
또한 원시타입 데이터들이 할당된다.
이때 원시타입 데이터들의 참조값이 아닌 실제 값을 저장한다.

scope에 따른 visibility란 ?
test라는 변수가 어떤 함수내에서 stack에 할당된 경우 해당 지역변수는 다른 함수에서 접근할 수 없다.

거두절미하고 예제를 보자 !

import java.util.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		int test = 2;
		sum(test);
 
	}
 
 
	public static int sum(int arg){
		int temp = arg + 6;
		int result = temp/4;
		return result;
	}
}

다음 코드가 Stack 메모리에 어떻게 쌓이는지 알아보자.

먼저 test 변수의 실제값2가 대입된다.
다음으로 sum 함수가 호출된다. 이때 test와 arg사이에 깊은 복사가 일어난다.

그 이후에
int temp = arg + 6;
int result = temp/4;가 실행된다
현재 스택의 상태는 아래와 같다.

그 이후 sum 함수가 종료되며 sum scope에서 사용되었던 지역변수들은 stack에서 지워지고 함수를 호출했던 시점으로 돌아가면 스택은 아래와 같이 변한다.

Heap
이제 heap 영역에 대해서 알아보자.

  • Heap 영역에는 주로 긴 생명주기를 가지는 데이터들이 저장된다. (대부분의 오브젝트는 크기가 크고, 서로 다른 코드블럭에서 공유되는 경우가 많다)
  • 애플리케이션의 모든 메모리 중 stack 에 있는 데이터를 제외한 부분이라고 보면 된다.
    모든 Object 타입(Integer, String, ArrayList, ...)은 heap 영역에 생성된다.
  • 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.
  • Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수가 stack 에 올라가게 된다.

(출처 : https://yaboong.github.io/java/2018/05/26/java-memory-management/)

profile
독자보다 필자를 위해 포스팅합니다

0개의 댓글