JAVA

메모리 구조(Stack, Heap)

superbono 2021. 6. 20. 15:01

 

* Stack area?

함수의 호출과 관계되는 지역 변수와 매개 변수가 저장되는 영역이다. 스택은 함수의 호출과 동시에 할당된다. 함수 호출이 완료되면 알아서 소멸한다. 기본 타입(정수타입(byte, char, short, int), 실수타입(float, double), 논리타입(boolean))등이 스택 공간에 저장된다. 크기가 정해져 있는 타입이고 메모리 할당시 시 컴파일할 때 계산이 이루어진다. 해당 메소드가 종료되면 메모리가 해제된다. 

 

* Heap area?

Heap 메모리 영역과 관련 있는 단어 - 동적 메모리 할당/메모리 동적 할당 (컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것. 해당 메모리의 사용이 끝나면 반납하고 다시 필요하면 재할당받는다. 동적으로 할당된 메모리는 프로그래머가 메모리를 반납하거나 garbage collection이 일어나기 전까지 계혹 할당되어 있다. JAVA는 garbage collector가 있어서 더이상 사용되지 않는 메모리를 알아서 반납(정리)하지만, c/c++은 garbage collector가 없기 때문에 사용자가 반납하지 않는 이상 계속 할당되어 있다. 아무튼 동적 할당은 프로세스의 힙 영역에 해당되는데, 프로세스가 계속 실행될 떄에는 동적 할당된 영역은 계속 유지된다. 따라서 프로그램에게 정해진 힙 영역의 크기를 넘는 메모리 할당을 요청하면 메모리가 할당되지 않는다. 따라서 사용이 완료된 메모리는 빨리 반납하는게 좋음 -> java garbage collection)

 

heap area에 데이터가 저장되는 데이터 타입은 참조형(reference type)의 객체(클래스), 인터페이스, 배열타입, 열거타입이다. (문자열도 객체이다)

변수(객체, 객체변수, 참조변수)는 stack영역에서 실제 데이터가 저장된 heap 영역의 참조값(주소)를 리턴받아 변수에 저장한다. 실제 데이터를 가지고 있는 heap영역의 참조 값을 stack 영역의 변수가 가지고 있는 것이다.  

 

class Person {
    int id;
    String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

public class PersonBuilder {
    private static Person buildPerson(int id, String name) {
        return new Person(id, name);
    }

    public static void main(String[] args) {
        int id = 23;
        String name = "John";
        Person person = null;
        person = buildPerson(id, name);
        System.out.println(person); // person의 주소값
    }
}

 

이 때, person을 print 해보면 person의 id, name값인 23, john이 나오는 것이 아니라 주소값이 나오는 것도 person이라는 객체를 heap 영역에 생성하여 주소를 가지고 참조하고 있기 때문이다. 

 

 

'JAVA' 카테고리의 다른 글

Interface(인터페이스)  (0) 2021.06.30
String과 StringBuilder 비교하기 (String vs StringBuilder)  (0) 2021.06.21
JDBC: executeQuery VS excuteUpdate  (0) 2021.04.25
상속(Inheritance)  (0) 2021.01.29
1. 자바 시작하기  (0) 2021.01.29