탐비의 개발 낙서장

[Memory] 메모리 모델과 JVM 가비지 콜렉터 본문

프로그래밍/운영체제

[Memory] 메모리 모델과 JVM 가비지 콜렉터

탐비_ 2021. 7. 22. 23:24
프로세스 메모리 구조 모델

 

프로세스 메모리 모델

 

TEXT 섹션

 - 프로그램에 있는 함수 코드, 제어문, 상수 등을 포함하며, 일반적으로 한 번 로딩하면 바뀌지 않습니다.

 - 단, JVM에서는 TEXT 영역을 사용하지 않습니다.

 

GVAR / BSS 섹션

 - 범위가 정해지지 않는 전역 변수(Global / Static)를 포함합니다.

 - GVAR는 초기값을 0이 아닌 특정한 값으로 지정한 경우 사용합니다.

 

HEAP 섹션

 - 동적으로 할당되는 메모리 공간으로, malloc 또는 new로 할당합니다.

 - 할당된 메모리는 free 또는 delete 함수를 이용해서 소멸시킵니다.

 - 힙 영역에 할당한 메모리 공간에 대한 주소를 참조하여 사용하는 경우가 많습니다.

 

STACK 섹션

 - 함수를 호출할 때 마다 지역 변수, 매개 변수 및 리턴값 등이 쌓입니다.

 

JVM GrabageCollector

 

 C / C++에서는 직접 free() / delete() 메서드를 호출하여 할당받은 메모리를 명시적으로 해제 해줍니다. 그렇지 않으면 memory leak가 발생하게 되고, 현재 실행 중인 프로그램에서 memory leak가 발생하여 다른 프로그램에도 영향을 끼칠 수 있습니다.

 

 반면 자바에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에, 오브젝트가 필요하지 않은 시점에서 알아서 불필요한 메모리를 정리해줍니다.

 

 대신, GC을 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 'stop-the-world' 가 발생합니다. 이때, GC를 실행하는 스레드를 제외한 나머지 스레드가 모두 작업을 멈추기 댸문에, GC가 완료된 이후에야 중단했던 작업을 다시 시작하게 됩니다.

 

 어떠한 방식의 GC를 사용하던, 실행 시간에 GC를 하는 이상 성능 하락을 피할 수는 없습니다. 대신, 메모리 누수를 방지해 주기 때문에 JVM에서 매우 중요한 역할을 합니다.