2016-12-02 1 views
-2

TotalAddrSpace (THeapStatus)가 충돌하여 2GB 수준에 도달하기 때문에 My Delphi6 프로그램이 충돌합니다. 나는 ($ SetPEFlags $ 20를 사용하여) 4GB 레벨의 한계를 늘릴 수 있었지만, 이는 결국 충돌을 지연시킨다.TotalUncommitted 메모리가 계속 증가하므로 My Delphi6 프로그램이 충돌합니다.

TotalUncommitted 메모리는 어떤 이유로 증가하는 반면 TotalCommitted 메모리와 TotalAllocated 메모리는 허용 가능한 수준 (약 550MB)으로 안정됩니다.

TotalUncommitted 메모리가 계속 증가하고 결국 TotalAddrSpace가 2GB (현재 : 4GB) 수준에 도달하여 프로그램이 충돌하는 이유를 알 수 없습니다. 프로그램에서

나는 길이가 내가 증가 또는 SetLength를 명령을 통해 간단한 조정을 정기적으로 줄일 수 많은 동적 배열를 사용합니다. 이러한 방식으로 동적 배열을 정기적으로 늘리거나 줄이면 효과적으로 TotalUncommitted 메모리의 범위를 넘어서게됩니까?

조언이나 통찰력이 있으면 대단히 감사하겠습니다. 어떻게 든 적극적으로 TotalUncommitted 메모리를 줄이기 위해 일반적인 메커니즘을 알고 또한 경우

...

+1

어쩌면 당신은 [힙 조각화] (http://stackoverflow.com/a/2569754/800214)의 영향을받을 수 있습니까? – whosrdaddy

+2

이것이 일어날 수있는 많은 이유. 우리 모두가 그들을 나열하려고 현실적이지 않습니다. 아마도이 질문은 너무 열악한 편입니다. 너무 광범위합니다. –

답변

-1

내가 가장 강하게 당신이 MemCheck 포함했다 특별한 빌드를 실행하는 것이 좋습니다. 그것은 귀하의 응용 프로그램에서 메모리 누수를 감지하는 정말 좋은 도구입니다. 더 현대적인 Delphi 버전은 FastMem 덕분에 일부 내장되어 있지만이 버전은 최초의 Delphi 버전부터 사용되어 버전 5,6,7에서 훌륭하게 작동합니다.

+1

[FastMM4] (https://github.com/pleriche/FastMM4)는 D4에서 Delphi 버전을 지원합니다. –

+0

동의하지만 FastMM을 많이 사용하지 않았습니다. (내 잘못이야) –

0

모든 도움에 감사드립니다 !!

내 문제는 힙 조각화 (또는 내 이해) 중 하나가 밝혀졌습니다.

필자는 필요에 따라 Setlength를 사용하여 항상 5 단계 단위로 동적 배열을 늘리거나 줄였습니다. 각 배열 요소의 크기를 감안할 때, 이것은 분명히 실제로 필요한 것보다 많은 메모리를 예약하도록 유도하여 Heap과 마찬가지로 Heap.TotalUncommited가 제한없이 커지게 만듭니다. TotalAddrSpace.

영향을 보려면 단계 크기를 다르게 시도했습니다. 다소 큰 단계 크기로 문제가 사라졌습니다.

관련 문제