* 모든 자바 프로그램은 자바가상머신(JVM)을 통해서 실행되는데,
이 자바 프로그램이 실행되면 JVM은 운영체제로부터 필요한 메모리를 할당받는다.
Method = 클래스, 클래스 변수
Heap = 객체, 인스턴스
Stack = 메소드, 지역변수, 매개변수
▶ Method (클래스, 클래스 변수)
= 자바 프로그램에서 사용되는 클래스에 대한 정보,
클래스 변수가 저장되는 영역
JVM 은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(.class)을 읽어들여,
해당 클래스에 대한 정보를 Method 에 저장
▶ Heap (인스턴스 변수, 동적할당) ; 낮은 주소에서 높은 주소로
= 자바 프로그램에서 사용되는 인스턴스 변수 저장
JVM 은 new 연산자를 통해 인스턴스를 생성하게 되면, 해당 인스턴스의 정보를 Heap 에 저장한다.
Heap 은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
동적할당은 Heap 에 속한다.
* 잠깐! 낮은 주소? 높은 주소?
= 메모리 낮은 주소 (0x00000000)
= 메모리 높은 주소 (0xFFFFFFFF)
* Heap 영역은 낮은 주소에서 높은 주소로
* Stack 영역은 높은 주소에서 낮은 주소로
(서로 반대방향으로 데이터가 쌓여서 침범할 수도 있을 것 같지만, 괜찮음
Heap 과 Stack 영역 사이에 큰 빈 공간이 존재하기 때문에 그럴 일은 없다.)
▶ Stack (메소드의 스택프레임) ; 높은 주소에서 낮은 주소로
= JVM 은 자바 프로그램에서 메소드가 호출되면, 메소드의 호출과 관계되는 지역변수와 매개변수를 Stack 에 저장
Stack 은 메소드의 호출과 함께 할당되며, 메소드 호출이 완료되면 소멸된다.
(즉, 메소드의 호출과 완료에 따라 할당과 소멸이 결정된다)
Stack 은 push 동작으로 데이터를 저장
Stack 은 pop 동작으로 데이터를 인출
Stack 은 후입선출 (즉, 가장 마지막에 넣은 데이터를 가장 먼저 인출한다) 방식으로 작동한다.
'Java' 카테고리의 다른 글
SubString() ; 문자열 자르기 함수 (0) | 2020.07.24 |
---|---|
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener (0) | 2020.07.24 |
equals() 와 == 의 차이 (0) | 2020.03.05 |
접근제한자 (0) | 2020.03.05 |
Singleton (0) | 2020.03.05 |