프로그램을 구동하기 위해서 운영체제가 메모리(RAM)에 데이터 및 명령어를 저장할 공간을 할당하여 준다. 프로그램이 실행되면 JVM(자바 가상 머신)은 운영체제로부터 메모리를 할당받는다. 메모리는 사용할 수 있는 공간이 한정되어 있어서 어떻게 관리하느냐에 따라 프로그램 성능이 좌우된다. 따라서 메모리를 효율적으로 사용하기 위해서는 메모리 영역을 이해할 필요가 있다.
메모리 영역 분류
스테틱(Static) 영역
메소드 영역과 같은 말
Class(클래스) 영역
Code(코드) 영역
Method (메소드) 영역
JVM이 동작해서 클래스가 로딩될 때 생성한다.
자바 프로그램에서 특정 클래스가 사용되면(호출될 때) 해당 클래스의 클래스 파일(*.class)을 읽어들여, 해당 클래스에 대한 정보를 스테틱 영역에 저장한다.
스테틱 영역에 저장되는 정보
클래스정보(멤버변수의 이름)
변수정보(데이터타입, 접근제어자정보)
메소드정보(메소드 이름, 리턴타입, 파라미터, 접근제어자 정보)
static변수(정적 멤버변수, static이 붙은 자료형)
final class변수
Constant pool(상수풀 : 문자상수, 타입, 필드, 객체참조가 저장됨)
스테틱 영역에 저장되는 정보는 JVM이 종료될 때까지 사라지지 않고 고정된(Static) 상태로 유지된다.
스테틱 영역에 있는 것은 어떤 곳에서나 접근이 가능해지기 때문에 '전역'이라는 키워드를 사용하며, 이 전역변수는 프로그램이 종료될 때까지 어디서든 사용이 가능하다.
전역변수를 무분별하게 사용하다 보면 메모리가 부족할 우려가 있다.
힙(Heap) 영역
모든 객체(Integer, String, ArrayList, ...)타입이 생성되는 영역이다.
JVM은 자바 프로그램에서 new 키워드를 사용하여 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장한다.
스레드의 갯수와 상관없이 하나의 heap 영역만 존재한다.
힙영역에 생기는 객체들의 레퍼런스 변수는 스택영역에 생긴다.
참조 변수나 필드가 없다면 의미없는 객체가 되어 JVM이 쓰레기로 취급하고 Garbage Collector를 실행시켜 자동으로 제거한다.
크기가 정해져 있지 않는 타입이다.(메모리 크기가 크다.)
힙 영역이 가득 차면 OutOfMemoryError가 발생한다.
스택(Stack) 영역
JVM은 자바 프로그램에서 블럭을 만나면 스택 프레임이 생기고, 블럭이 끝나면 스택 프레임이 사라진다. 해당 메소드(메소드라고 표현했지만 메소드 포함 하나의 블럭)와 관련된 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시값들은 스택영역에 올라간다.
기본형 타입 변수의 값들은 stack영역에 저장되고, 참조형 타입 변수는 참조값(heap 영역에 존재하는 인스턴스(객체)를 가르키는 역할)만 저장된다.