흔히 '가비지 컬렉션'이라고 하는데, java 가상 머신에서 메모리를 어떻게 관리하는지 궁금하신 분들이 있으실 겁니다. 요약을 하자면 아래 이미지와 같이 메소드, 스택, 힙 영역으로 나누어서 메모리를 쌓아둡니다. 특히나 힙 영역에는 인스턴스 메모리를 저장해두는데 자바 가상 머신은 힙 영역을 관찰하고 있다가, 인스턴스를 참조하고 있는 변수들이 사라지면 가비지 컬렉션에 대상이 됩니다.
1. 자바 가상머신의 메모리 영역
1-1. 메소드 영역 : 메소드의 바이트 코드, static 변수
메소드 영역은 메소드의 바이트 코드들이 쌓입니다. 자바 응용프로그램에서 main 메소드의 호출에서부터 시작을해서 지속적으로 다른 메소드들의 호출이 이루어지면서 프로그램이 진행된다. 즉, 메소드의 바이트코드는 프로그램의 전체 흐름을 이야기하며, 컴파일된 바이트코드의 대부분을 의미 합니다. 따라서 메소드의 바이트코드는 컴파일된 바이트코드의 대부분이기 때문에, 전체 바이트코드가 올랄간다고 봐도 될거 같습니다. 그리고 static 변수 뿐만 아니라, 메소드의 바이트코드가 올라가기 때문에, static 메소드도 여기에 포함됩니다.
1-2. 스택 영역 : 지역변수, 매개 변수
스택 영역은 메소드 내에서만 유효한 변수들이 스택 영역에 쌓이게 됩니다. 즉 스택은 프로그램의 실행 과정에서 임시로 할당되었다가, 메소드를 빠져나가면 바로 소멸되는 특성의 데이터 저장을 위한 메모리 영역입니다. 결론적으로 지역변수와 매개변수는 선언되는 순간에 스택에 할당되었다가, 자신이 할당된 메소드의 실행이 완료되면 스택에서 소멸이 됩니다.
public static void main(String[] args)
{
int num1 = 10;
....
}
위와 같은 코드가 있을 때, 아래와 같이 스택 구조 형태로 매개변수부터 지역변수들에 메모리가 쌓이게 됩니다.
1-3. 힙 영역 : 인스턴스
public static void simpleMethod()
{
String str1 = new String("String1");
String str2 = new String("String2 ");
....
}
위와 같은 코드가 있을때, String 인스턴스의 생성문이 메소드 내에 존재하므로 str1과 str2는 참조 변수이자 지역변수입니다. 따라서 str1과 str2는 스택에 할당이 이뤄지는데, 인스턴스는 무조건 힙에 할당이 되니, 위의 문장 실행으로 인해서 메모리 공간에는 다음의 관계가 형성됩니다.
2. 자바 가상 머신의 인스턴스 소멸시기
public static void simpleMethod()
{
String str1 = new String("String1");
String str2 = new String("String2");
....
str1 = null;
str2 = null;
....
}
참조 변수 str1, str2에 null을 대입함으로써 인스턴스 "String1"과 인스턴스 "String2"은 어떠한 참조 변수도 참조하지 않는 상태에 놓이게 됩니다.
위 그림과 같이 어떠한 참조 변수로도 참조가 이뤄지지 않는 인스턴스는 존재할 이유가 없습니다. 이렇게 "String1", "String2" 인스턴스는 자바 가상 머신에 의해서 소멸 대상이 됩니다. 이런 기능을 '가비지 컬렉션'이라고 표현합니다.
'Java' 카테고리의 다른 글
Gson Expose 어노테이션 (2) | 2021.01.05 |
---|---|
상속과 다형성 3(Program to interface) (0) | 2020.11.07 |
상속과 다형성 2(추상 타입을 이용한 구현 교체의 유연함) (0) | 2020.11.05 |
상속과 다형성 1 (0) | 2020.11.04 |