프로그램은 개발자가 개발 도구를 이용해 개발하고 운영체제를 통해 물리적 컴퓨터인 하드웨어 상에서 구동된다.
자바 개발자는 본인이 사용 중인 플랫폼에 설치된 JVM용으로 프로그램을 작성하고 배포하면 각 플랫폼에 맞는 JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는 데 아무 문제가 없게끔 만들어준다. 이러한 자바의 특성을 "Write Once Run Anywhere"라고 한다.
객체 지향 프로그램에서는 데이터 저장 영역을 스태틱(Static) 영역, 스택(Stack) 영역, 힙(Heap) 영역으로 분할해서 사용한다.
- T 메모리 구조
- java.lang 패키지
- main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업으로 T메모리의 스태틱 영역에 배치
- import 패키지와 클래스들
- main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업으로 T메모리의 스태틱 영역에 배치
- 메서드 스택 프레임
- 여는 중괄호로 스택 프레임이 만들어지고 닫는 중괄호로 스택 프레임이 소멸
- JVM
- JRE
- 블록 스택 프레임
- 여는 중괄호로 스택 프레임이 만들어지고 닫는 중괄호로 스택 프레임이 소멸
- 해당 블록이 존재하는 메서드 스택 프레임 안에 블록 스택 프레임이 생성됨
지역 변수는 스택 영역에서 일생을 보낸다. 그것도 스택 프레임 안에서 일생을 보내며 스택 프레임이 사라지면 함께 사라진다.
클래스 멤버 변수는 스태틱 영역에서 일생을 보낸다. 스태틱 영역에 한번 자리 잡으면 JVM이 종료될 때까지 고정된(static) 상태로 그 자리를 지킨다.
객체 멤버 변수는 힙에서 일생을 보낸다. 객체 멤버 변수들은 객체와 함께 가비지 컬렉터라고 하는 힙 메모리 회수기에 의해 일생을 마치게 된다.
"외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다"
두 메서드 사이에 값을 전달하는 방법
- 메서드를 호출할 때 메서드의 인자를 이용하는 방법
- 메서드를 종료할 때 반환값을 넘겨주는 방법
전역변수의 사용은 되도록 피하는 게 좋지만 원주율과 같이 읽기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 추천!
멀티 스레드/멀티 프로세스
멀티 스레드
- 멀티 스레드의 T 메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것
- 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하는 구조
- 멀티 프로세스 대비 메모리를 적게 사용할 수 있는 구조
멀티 프로세스
- 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조
- 각 프로세스마다 각자의 T 메모리가 있고 각자 고유의 공간이므로 서로 참조할 수 없는 구조
- 다른 프로세스의 T 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 그만큼 크다.