[ JAVA ] 메모리구조 -STATIC & HEAP & STACK
public class MemoryClass {
public static void main(final String[] args) {
int i = 0;
MemoryClass memoryClass = new MemoryClass();
memoryClass.myMethod(memoryClass);
}
private void myMethod(final Object obj) {
int i = 1;
String s = "HelloWorld!";
}
}
STATIC :
필드 부분에서 선언된 변수(전역변수)와 static키워드가 붙은 자료형 혹은 메소드는 Static 영역에 데이터를 저장한다.
Static 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.전역변수가 프로그램이 종료될 때까지 어디서든 사용이 가능한 이유이기도 하다.
JVM은 메인 메소드를 가장 먼저 호출을 한다. 메인메소드에서 사용하는 클래스와 static변수가 메소드 영역에 올라오게 된다.
STACK :
메모리(RAM) 영역 중 일부로, main() 을 포함한 각 메서드 의 호출시 생성되는
지역변수(원시타입(primitive types)의 데이터형 - byte, short, int, long, double, float, boolean, char타입)와 매개변수가 저장되는 공간을 말하며 메서드 실행이 완료 되면 스택에서 제거(소멸)됨
변수가 생성될 때 생성된 순서대로 차곡차곡 쌓인다.
스택은 LIFO(last in first out) 데이터 구조로 되어있어 가장나중에 들어온 데이터가 가장 먼저 인출된다.
CPU가 스택 메모리를 효율적으로 관리하기 때문에, 스택 변수를 읽거나 쓰는 것은 매우 빠르다.
변수값을 저장하게 되는데 기본타입인 정수형 변수와 실수형 변수와 논리형 변수를 실제값으로 저장한다.
메모리 할당시 컴파일할때 이미 크기 계산이 이루어지고 메소드 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워짐 .
* 스택에 쌓이는 변수중 참조변수에 저장되는 메모리주소는 스택영역에 저장되고 그 주소가 가리키는 참조값은 HEAP 영역에 저장된다.
HEAP :
메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있고 또한 직접 관리를 해야하는 메모리 영역이다.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제되며 자바에서는 new 연산자를 이용해서 메모리를 할당하는 것은 전부 힙(heap) 영역에 할당하는 것이라고 생각해도된다.
힙 영역은 객체와 배열이 생성되는 공간이고 참조타입(배열, 열거, 클래스, 인터페이스)들을 힙영역에 주소형식으로 저장한다. 메모리 할당시 프로그램을 실행할때 메모리를 빌려 동적으로 할당하며 크기가 정해져있지않다. 힙 영역에 보관되는 메모리는 메소드 호출이 끝나도 사라지지 않고 유지된다. 참조하는 변수가 없다면 Gabage Collector 에 의해 메모리가 해제 될 때 까지 유지되고 자동으로 힙영역에서 제거됨.