자동 저장 기간
과 동적 저장 기간
을 구분한다.자동 저장 기간
을 가지며 컴파일러는 이를 stack에 저장한다.동적 메모리 할당(새로 생성)
이 있는 개체는 일반적으로 heap이라고 하는 자유 저장소에 저장된다.stack은 본질적으로 접근하기 쉬운 메모리로 단순히 항목을 잘 스택으로 관리한다. 크기를 미리 알고 있는 항목만 스택에 들어갈 수 있다. 예를들어 int, String, boolean
언제 스택에 객체를 할당할 수 있을까?
객체를 저장하기 위한 스택이 런타임 호출 스택과 동일하다는 것이다.
스택 프레임
으로 구성된 런타임 스택
은 1.프로그램 실행
과 2.함수 호출
을 담당한다.
스택 프레임
에는 하나의 함수 호출에 대한 매개 변수
, 반환 주소 및 로컬 변수
와 같은 모든 데이터가 포함된다.
스택에 할당된 개체는 이러한 로컬 변수의 일부이다.
반환 주소는 함수가 반환된 후 실행되는 코드를 결정한다.
컴파일 시 알려진 고정 크기의 개체만 스택에 할당할 수 있다.
스택 프레임
은 함수의 실행 시간 동안에만 존재하며, 스택 프레임의 객체도 마찬가지이다.
스택 할당 개체로 인한 메모리 누수에 대해 걱정할 필요가 없다는 장점이 있지만, 함수에서 돌아오면 개체를 더 이상 사용할 수 없다.
heap은 정확한 크기와 구조를 미리 결정할 수 없는 항목에 대한 메모리이다.
객체와 배열은 런타임에의해 변경될 수 있기 때문에 힙으로 들어가야 한다.
heap은 런타임 스택
과 완전히 독립적인 추가 스토리지라고 생각할 수 있습니다. 특별한 레이아웃이 없는 메모리이다.
프로그램 실행과 관계없이 이 힙에 메모리를 요청할 수 있습니다.
메모리를 할당할 때 시스템은 다른 어떤 것도 동일한 메모리를 사용할 수 없도록 하고 데이터를 무효화한다.
힙의 개체는 메모리를 할당한 함수를 종료한 후에도 계속 유지된다.
하지만 이제 힙의 메모리를 확보하는 것은 본인이 해야한다.
그렇지 않으면 메모리 누수가 발생하게 된다.
가비지 컬렉션이 있는 언어에서는 가비지 컬렉터가 힙의 메모리를 확보하여 메모리 누수를 방지한다.