자바 메모리 관리 ?
JVM 은 시스템 ( 운영 체제 ) 로 부터 프로그램을 실행하는 데 필요한 메모리를 할당 받고 JVM 은 할당 받은 메모리를 용도에 따라 세 영역으로 나누어 관리한다.
자바는 C언어와 같이 직접적인 메모리 주소에 접근할 수 없으며, 개발자가 메모리를 할당 받거나 반환하지 않아도 되는 구조이기 때문에 일반적인 응용 프로그래머의 경우, 구체적인 메모리 관리에 대해서 자세히 알 필요가 없다..
다만 프로그램 동작 구조를 보다 정확히 이해하기 위해서 다음 내용은 알아둘 필요가 있다.
메서드 영역 ( Method area )
프로그램 실행 중 특정 클래스가 사용되면, JVM 은 해당 클래스의 클래스 파일 (.class)을 읽어서 분석한 다음 클래스에 대한 정보를 이곳에 저장한다. 이때, 클래스 변수 나 메서드 ( static ) 도 이 영역에 함꼐 생성된다.
main() 에서 클래스에 선언된 변수에 접근 할 수 없는 것도 이러한 이유로 main() 은 static 으로 선언되어 있기 때문에
클래스에 선언된 멤버 변수 ( 인스턴스 변수 ) 를 사용할 수 없으며 인스턴스의 변수들은 힙 영역에 생성되기 때문에 인스턴스를 통해서만 접근이 가능한 것이다.
힙 영역 ( heap area )
프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수들이 생성되는 공간으로 대부분 메모리 공간으로 대부분의 메모리 공간은 힙 영역이 된다.
서버 시스템이나 메모리 사용이 많은 프로그램을 개발하거나 실행할 때, 힙 메모리 부족으로 문제가 생길 수 있으므로
이 경우 JVM 메모리 옵션을 조정해 줘야 한다.
호출 스택 ( call stack or execution stack )
호출 스택은 메서드 실행에 필요한 메모리 공간을 말한다.
메서드가 호출될 때 호출 스택에는 호출된 메서드를 위한 메모리가 할당되며 이 메모리는 메서드가 작업을 수행하는 동안 지역변수 및 매개변수 들의 연산 중간 결과 등을 저장하는데 사용된다.
메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 정리( 비워짐 ) 된다.
지역 변수들의 경우 멤버 변수나 다른 함수에서 사용된 변수들과 이름이 같아도 문제가 없는 이유이다.
가비지 컬렉션 ( garbage collection )
줄여서 GC 라고도 한다. 쉽게 말하면 자바에서 사용되지 않는 메모리를 정리해주는 작업이라고 할 수 있다.
GC 과정은 전체적인 JVM 성능에 영향을 미치는 요소이므로 오랜시간 동안 발전을 거듭해 오늘에 이르렀다.
가비지 컬렉터는 가비지 컬렉션을 수행하는 주체가 된다.
규모가 크지 않거나 특히 컨테이너 기반에서 동작하는 ( 웹서버 (WAS) 프로그램이나 안드로이드 등 ) 프로그램들의 경우
일반 개발자들이 신경 쓸 일이 많이 않고 개발자가 직접 System.gc() 를 이용해서 가비지 컬렉션을 동작시키는 것은 권장되지 않는다.
