C++에서 프로그램 시작 시 72KB 메모리가 할당되는 이유, 파헤쳐 보자!

by DD
3개월 전
조회수 26

C++ 프로그램 시작 시 72KB 메모리가 할당되는 현상의 원인을 분석

libstdc++의 예외 처리(Exception Handling)를 위한 '긴급 풀(Emergency Pool)' 할당이 주된 이유임

Valgrind에서 초기 메모리 할당을 메모리 누수로 오해하는 경우가 있었음

GLIBCXX_TUNABLES 환경 변수를 통해 긴급 풀의 크기를 조절할 수 있음

초기 할당의 원인: libstdc++의 예외 처리

본문에서는 C++ 프로그램 시작 시 발생하는 72KB 메모리 할당의 원인을 libstdc++예외 처리(Exception Handling) 메커니즘에서 찾는다. 특히, '긴급 풀(Emergency Pool)'이라는 예외 처리를 위한 메모리 할당이 초기 메모리 사용량 증가의 주된 원인으로 지목된다. 이는 malloc 호출 실패 시 예외를 처리하기 위한 안전 장치로, 프로그램 시작 시점에 미리 할당된다.

긴급 풀(Emergency Pool)의 동작 방식

기술적으로 보면, 긴급 풀(Emergency Pool)malloc 호출 실패 시 예외를 처리하기 위해 사용되는 메모리 영역이다. libstdc++는 프로그램 시작 시 이 풀을 할당하며, 예외 객체를 저장하는 데 사용된다. GLIBCXX_TUNABLES 환경 변수를 통해 긴급 풀의 객체 수를 조절하여 할당 크기를 변경할 수 있다. 이러한 메커니즘은 예외 발생 시 메모리 할당 실패를 방지하여 프로그램의 안정성을 높인다.

Valgrind와 메모리 누수 오해

커뮤니티에서는 Valgrind와 같은 메모리 분석 도구에서 초기 할당된 72KB 메모리를 메모리 누수로 오해하는 경우가 있었다고 지적한다. 이전 버전의 Valgrind는 긴급 풀을 해제하지 않아 '아직 접근 가능한(still reachable)' 메모리로 표시했기 때문이다. 최신 버전에서는 __gnu_cxx::__freeres() 함수를 통해 긴급 풀을 해제하여 이러한 오해를 방지한다.

긴급 풀 크기 결정 및 환경 변수 활용

본문에서는 긴급 풀의 크기가 EMERGENCY_OBJ_SIZE, EMERGENCY_OBJ_COUNT 매크로에 의해 결정된다고 설명한다. 또한, GLIBCXX_TUNABLES 환경 변수를 사용하여 glibcxx.eh_pool.obj_count 값을 변경함으로써 긴급 풀 내 객체 수를 조절할 수 있음을 보여준다. 이러한 설정을 통해 개발자는 환경에 맞게 메모리 사용량을 최적화할 수 있다.

Why is the first C++ (m)allocation always 72 KB?