프로그램이 메모리를 사용하는 방식
기계어를 포함한 모든 프로그래밍 언어의 메모리 사용 방식은 공통적으로 코드 실행 영역과 데이터 저장 영역으로 나뉜다.
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드 되어야하고 또한 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다.
컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같음
실행할 프로그램의 코드가 저정되는 영역 기계어 코드가 들어감, CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함.
초기값 있는 전역변수,배열,static으로 선언된 변수가 들어감, 전역(gloval)변수,정적(static)변수, 초기화된 배열과 그 구조들이 저장되는 영역, 프로그램 시작과 동시에 할당되고, 프로그램 종료시 메모리 소멸.
객체 지향 프로그램에서의 데이터 저장 영역
static 영역
클래스들의 놀이터
자바에서 JRE는 먼저 프로그램 안에 main() 메서드가 있는지 확인
main()메서드의 존재가 확인되면 JRE는 프로그램 실행을 위한 사전 준비 착수
JVM을 부팅 시키고 JVM은 전처리 과정을 시작
JVM은 가장 먼저 java.lang 패키지를 static영역에 가져다 놓음(java.lang 패키지가 있어서 System.out등을 쓸 수 있음)
그 다음 JVM은 개발자가 작성한 모든 class 와 import 패키지를 static 영역에 가져다 놓음
stack 영역
메서드들의 놀이터
여는 중괄호를 만날 때마다 stack에는 stack frame이 생김 (클래스 정의를 시작하는 여는 중괄호 빼고)
그 이후 메서드 인자들의 변수 공간을 할당
닫는 중괄호로 stack frame 소멸됨
heap 영역
객체들의 놀이터
클래스로부터 객체가 생성될 때, 속성의 값을 저장하기 위해 메모리 공간이 할당되는 영역
call by value
메서드를 호출하면서 인자로 전달되는 것은 변수 자체가 아니라 변수가 저장한 값만을 복제해서 전달하는 방식
멀티 스레드 / 멀티 프로세스 이해
멀티 스레드(Multi Thread)의 T메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것
멀티 프로세스(Multi Process)는 다수의 데이터 저장 영역, 즉 다수의 T메모리를 갖는 구조
멀티 프로세스는 각 프로세스마다 각자의 T 메모리가 있고, 각자 고유의 공간이므로 서로 참조할 수 없다. 그에 반해 멀티 스레드는 하나의 T메모리만 사용하는데 스택 영역만 분할해서 사용하는 구조이다.
멀티 스레드는 하나의 T메모리 안에서 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레디의 스택 영역에는 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하는 구조이다. 따라서 멀티 프로세스 대비 메모리를 적게 사용할 수 있는 구조이다.
자바 웹 프로그래밍에서는 서블릿은 요청당 프로세스가 아닌 요청당 스레드를 생성함
객체 생성 과정
클래스 정의 됨
스택 영역의 어떤 메서드 프레임안에서
클래스 객체 생성
객체는 heap메모리에 생성되고
스택 영역의 메서드 프레임안에는 객체 참조변수는 heap메모리에 생성된 객체의 주소값을 갖게 됨
객체 참조변수에 null 값을 할당하게 되면
더 이상 heap메모리에 생성된 객체는 참조변수가 없으므로 후에 가바지 컬렉터가 수거해 감
상속된 클래스 인경우
heap 메모리에 클래스와 상속클래스 둘다 생성됨
가비지 컬렉터
가비지 컬렉터는 아무도 참조하지 않는 객체를 쓰레기로 인지하고 수거한다.