익숙하지 않은 대형 코드베이스의 메모리 사용 공간 줄이기


4

C/C++에서 상당히 오래된 (10 년 전부터 시작된) 상당히 오래된 (~ 2.2 MLOC) Windows 데스크톱 응용 프로그램이 있다고 가정 해보십시오. 모듈의 약 10 %는 외부에 있으며 소스가 없으며 디버그 기호 만 있습니다.

응용 프로그램의 메모리 사용 공간을 절반으로 줄이면 어떻게 될까요? 적어도 메모리가 소비되는 곳을 찾으려면 어떻게해야할까요?

0

나는 귀하의 질문에 잘 부합한다고 생각하지 않습니다.

소스 코드의 크기는 메모리 풋 프린트와 직접 관련이 없습니다. 물론 컴파일 된 코드는 약간의 메모리를 차지하지만 응용 프로그램은 자체 메모리 요구 사항을 갖게됩니다. static (코드에서 선언 된 변수)과 dynamic (응용 프로그램에서 만드는 객체)입니다.

저는 프로그램 실행을 프로파일 링하고 코드를 신중하게 연구하도록 제안합니다.

  0

크기를 볼 수 있다는 것이다. KLOC 400 명을 "신중하게 연구"하는 데 얼마나 시간이 걸릴 것이라고 생각하십니까? :) 23 sep. 082008-09-23 19:01:56

  0

쉬워야합니다. 400k는 내가 큰 콜을하는 것이 아니다. 힙 할당을 점검하고, 모든 malloc과 새로운 호출을 찾아야 만하고 거의 다있다. 23 sep. 082008-09-23 19:06:57

  0

gbjbaanb, 나는 당신이 * 단지 * 모듈 의존성 그래프를 보여줄 수 있었으면 좋겠다. 그리고 "모든 malloc과 new를 찾는다"는 것에 대해서도 최소한 SysAllocString (CComBSTRs 내부에 묻혀있는 경우가 종종 있음)이있다. 23 sep. 082008-09-23 19:45:05


2

쉬운 일이 아닙니다. 당신이 찾을 수있는 메모리 누수를 추적하여 시작하십시오 (좋은 도구는 Rational Purify입니다). 소스 코드를 훑어보고 데이터 구조 및/또는 알고리즘을 최적화하십시오.
죄송합니다. 비관적으로 들릴 수 있지만 메모리 사용량을 50 % 줄이면 현실적으로 들리지 않습니다.


7

할당량이 얼마나 큰지 추적하는 래퍼와 (호출 스택을 기록하고 나중에 심볼 테이블에서이를 해결하여) malloc()/free() 및 new()/delete 에서. 종료시 래퍼가 여전히 할당 된 메모리를 표시하게하십시오.

이렇게하면 가장 큰 할당이있는 곳을 찾아 내고 누수를 잡을 수 있습니다.

  0

할당 함수를 오버라이드 응용 프로그램 전체, 제한된 소스 코드 변경이 바람직합니까? 또한 COM/BSTR 처리가 많이 있습니다. 나는 할당 자들이 분석에서 제외 될 수 없다고 생각한다. 23 sep. 082008-09-23 19:39:20


3

this is description/skeleton 메모리 추적 응용 프로그램 나는 게임의 메모리 소비를 20 % 줄이기 위해 사용했습니다. 그것은 내가 외부 모듈에 의해 수행 된 많은 할당을 추적하는 것을 도왔다. 응용 프로그램이 사전 할당 메모리를 많이합니까

나중에 사용할 수 있도록 : 날이 될 것이기

  0

이전에 디버그 인터페이스 액세스에 대해 들어 본 적이 없습니다. 23 sep. 082008-09-23 20:33:56


0

첫 번째 장소 시작? 이 기억은 종종 사용되지 않고, 결코 전달되지 않습니까? 필요에 따라 새로 만들기/삭제 (또는 smart_ptr 사용을 권장)로 전환하는 것이 좋습니다.

코드는

Object arrayOfObjs[MAX_THAT_WILL_EVER_BE_USED]; 

같은 정적 인 배열을 사용하여,이 배열 OBJS을 나눠 하는가? 그렇다면이 메모리를 수동으로 관리하는 것이 좋습니다.


1

매우 중요한 비효율을 매우 빠르게 발견 할 수있는 가능성이 있습니다. 먼저 사용 된 메모리가 무엇인지 확인해야합니다. 내가 이것을 매우 편리하게 찾은 도구는 다음과 같습니다. Memory Validator

일단 "메모리 사용량지도"를 사용하면 Low Hanging Fruit을 확인할 수 있습니다. 좀 더 콤팩트 한 형태로 표현 될 수있는 많은 메모리를 소비하는 데이터 구조가 있습니까? 이것은 종종 가능합니다. 데이터 액세스가 잘 캡슐화 된 경우 여분의 CPU 성능이 필요할 때마다 각 액세스마다 압축/압축 해제 할 수 있습니다.

  0

그는 "10 년 전, 변경되지 않았 음"또는 "지난 10 년 동안 유기적으로 성장하고 축적 해왔다"는 의미인지 여부에 달려 있습니다. 두 번째 범주의 앱은 분명히 메모리가 돼지 일 수 있습니다. 23 sep. 082008-09-23 19:08:28

  0

성장했습니다. 그리고 축적. 리소스 소비를 줄이기위한 요구 사항은 항상 그렇듯이 위에서 아래로 전달됩니다. 23 sep. 082008-09-23 19:31:54


0

메모리 사용량 분석을위한 도구 중 하나는 LeakDiag이며 free download from Microsoft에서 사용할 수 있습니다. 모든 사용자 모드 할당자를 VirtualAlloc에 ​​연결하고 프로세스 할당 스냅 샷을 언제든지 XML에 덤프 할 수 있습니다.그런 다음 이러한 스냅 샷을 사용하여 대부분의 메모리를 할당하는 호출 스택과 누출중인 호출 스택을 확인할 수 있습니다. 스냅 샷 분석에 대한 프론트 엔드가 부족합니다 (Microsoft Premier Support를 통해 LDParser/LDGrapher를 사용할 수 없다면). 그러나 모든 데이터가 있습니다. 주의 할

한가지 더 당신이 때문에 캐싱 BSTR 할당에서 잘못된 누출 양성이 프로젝트의 전반적인 복잡성에 소스 코드 힌트의 "Hey, why am I leaking all my BSTR's?"