본문 바로가기
study_java/자바 공부하기

프로그램의 실행과 메모리 관리

by developer_j 2020. 5. 20.
728x90
반응형

1. 프로그램 실행 과정

자바 소스코드 파일은 컴파일러에 의해 자바 가상 머신이 해석할 수 있는 바이트 코드 파일, 즉 클래스 파일로 변환된다. 이 클래스 파일을 클래스 로더가 읽어 메모리에 올릴 준비를 하고, 자바 가상머신이 효율적인 메모리 관리를 위해 분할한 데이터 영역의 역할에 따라 클래스 파일의 데이터들이 분배된다.

프로그램이 실행되는 동안 할당된다고 해서 Run-time Area라고 불리는 <메모리 공간> 영역은 클래스 영역(Method 영역이라 부르기도 함), 스택 영역, 힙 영역으로 나뉜다.

클래스 영역에는 클래스 로더가 읽어온 내용에 기반하여 클래스 데이터들이 저장된다. 전역 변수, 정적 변수(static 키워드가 붙은 변수)가 여기에 들어간다. 클래스 영역은  로더가 읽어온 내용에 기반한, 프로그램 실행에 필요한 데이터들(메소드 정보, 클래스 정보 등등)이 전반적으로 우선 클래스 영역에 저장된다. 이 영역은 프로그램 시작부터 종료까지, 설계도 같은 역할을 하며 메모리 사용을 유지한다.

클래스 영역의 내용들을 바탕으로 프로그램이 진행되는데, 스택 영역에는 메소드 수행에 필요한 메모리 공간이 필요한만큼 제공된다. 이를 보고 동적 할당이라 하는데, 임시메모리로 이해하면 편하다. 필요한 때에, 필요한 만큼만 할당하기 때문이다. 즉, 메소드가 호출되면 호출된 메소드에 필요한 메모리를 할당하고, 여기에 지역변수나 매개변수, 연산의 중간 결과, 리턴값 등이 저장된다. 메소드가 종료되면 메모리 공간은 반환되므로 여기에 할당된 데이터들은 사라진다.

힙 영역에는 인스턴스 변수, 즉 객체가 생성된다. new 연산자로 생성된 객체나 배열을 저장한다. 클래스 영역에 로드된 클래스만 생성할 수 있고, 메모리를 관리하는 가비지 콜렉터의 정리 대상이 된다.

 +) 힙 영역과 스택 영역은 사실 같은 공간을 공유하고 있다. 힙 영역은 메모리 위쪽 주소부터 할당되고, 스택 영역은 아래쪽부터 할당된다. 그렇기 때문에 두 영역이 서로 공간을 침범하는 경우가 생기는데, 이 경우가 바로 Heap Overflow (heap영역이 커지다가 stack 영역 침범) & Stack Overflow(stack영역이 커지다가 heap 영역 침범)인 것이다.

 


2. 메모리의 관리

java의 가비지 컬렉터는 메모리 상황을 추적하여, 더이상 사용하지 않는 데이터를 메모리 공간에서 제거시키는 것을 말한다. 따라서 자바를 이용할 때에는 직접 메모리 문제를 관리할 필요가 없다.

가비지 컬렉터는 참조되지 않는 객체를 힙 영역에서 제거시키는 역할도 수행한다.

한편 객체가 사라져도 static 데이터는 사라지지 않는다. 왜냐하면 자바는 프로그램을 실행할 때, 프로그램에 필요하다고 판단되는 대부분의 데이터를 클래스 영역에 저장하는데 이 때 클래스 변수들이 여기에 저장되어 프로그램이 종료될 때 까지 메모리 안에 남아있기 때문이다.  이러한 이유로, 인스턴스 안에 선언되어 있는 클래스 데이터들은 객체가 사라져도 클래스 데이터 영역에서 유지된다.

728x90
반응형