728x90

자바 가상머신은 운영체제 위에서 동작하며, 운영체제가 할당해 주는 메모리 공간을 기반으로 가상머신을 실행하면서, 

자바 응용 프로그램의 실행도 돕는다.

할당받은 메모리의 효율적인 사용을 위해 메모리 공간을 크게 세 개의 영역으로 나눈다.

 

  1. 메소드 영역 : 메소드의 바이트코드, static 변수
  2. 스택 영역 : 지역변수, 매개변수
  3. 힙 영역 : 인스턴스

1. 메소드 영역

자바 바이트 코드란 자바 가상머신이 이해 가능한 언어로 변환된 자바 소스 코드를 의미한다. 이런 바이트코드들도 메모리 영역에 있어야 실행이 가능하고, 메소드 영역에 위치하게 된다.

static으로 선언되는 클래스 변수도 이 영역에 할당된다.

바이트코드와 static 변수가 메소드 영역에 저장되는 시점이 바로 '클래스가 메모리에 올려지는 시점'이다.

즉 메소드 영역은 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.

 

2. 스택 영역

스택은 지역변수와 매개변수가 저장되는 공간이다. 이 두 변수의 공통점은 메소드 내에서만 유효한 변수라는 점이다.

즉 스택은 프로그램의 실행과정에서 임시로 할당되었다가, 메소드를 빠져나가면 바로 소멸되는 데이터들을 위한 영역이다. 후입선출의 특징을 지닌 stack 자료구조처럼, 메소드에 들어가면 매개변수와 지역변수를 스택에 쌓았다가, 메소드를 빠져나가면 스택에서 값을 소멸시킨다.

 

3. 힙 영역

힙 영역에는 인스턴스가 할당이 된다. 인스턴스를 스택이 아닌 힙에 저장하는 이유는, 소멸방법과 시기가 다르기 때문이다.

예를들어, String str = new String("abc"); 라는 코드를 실행시키면 str은 스택영역에 "abc"는 힙 영역에 저장된다. 이렇게 저장된 "abc"는 언제 소멸이 될까? 인스턴스의 소멸시기를 결정하는 것은 자바 가상머신의 역할이다. 자바 가상머신이 이제 이 인스턴스를 소멸시켜도 되겠다고 판단하면 자동으로 소멸이 된다. 

 

Garbage Collection

String str = new String("abc"); 라는 코드로 스택과 힙 영역에 str, "abc"를 저장한다.

그 후 str=null;이라는 코드를 실행하면 str은 더이상 "abc"를 참조하지 않는다.

이렇게 어떤 참조변수로도 참조가 이뤄지지 않는 인스턴스는 존재할 이유가 없고, 소멸의 대상이 된다.

이런 조건을 만족할 때 자바 가상머신은 해당 인스턴스를 소멸시킬 수 있다. 

자바의 인스턴스 소멸기능을 가비지 컬렉션(Garbage Collection)이라고 하며, 프로그래머의 편의를 돕는 자바의 독특한 기능이다. 

다만 소멸 시점은 시스템에 부담이 되지 않도록 별도의 알고리즘을 기반으로 계산 후에 수행된다.

728x90

+ Recent posts