2017-02-14 8 views
-2

우리는 .NET 어셈블리를 사용하는 상당히 복잡한 델파이 애플리케이션을 보유하고 있습니다. 우리는 FastMM을 메모리 관리자로 사용합니다.Delphi Windows Desktop App - 실행시 513MB의 메모리 사용 - 유휴 상태가 50 분이 경과 한 후> 32.1MB

EOutOfMemory 예외가 발생했습니다. 그래서 나는 이것을 잠시 동안 조사하고 있습니다. Delphi 객체간에 순환 참조가 있다고 의심했습니다. 또는 일부 .NET 객체가 Delphi 객체에 대한 참조를 보유하여 객체가 릴리스되지 못하게 할 수 있습니다.

지금까지 나는 우리가 끝 부분에서 변경할 수있는 것을 찾지 못했습니다. 분명히 어딘가에 문제가 발생했기 때문에 정말 실망 스럽습니다.

그러나 오늘 나는 순수한 기회에 의해 뭔가를 발견했습니다. 우리의 응용 프로그램이 시작되면 작업 관리자가 ca를보고합니다. 513MB 메모리가 사용 중입니다. 방금 ​​시작했지만 점심 먹으러 나가야했습니다. 내가 돌아 왔을 때 우연히 App이 현재 75MB 만 사용하고있는 것으로 나타났습니다. 이상하게 생각했는데, 추락했거나 내가 추측 한 것이 틀림 없어. 아니요, 앱이 완벽하게 작동하고 있습니다. 나는 무엇을 했는가 -> 아무것도. 그냥 유휴 상태로 두십시오. 우리의 응용 프로그램은 Windows 데스크톱 응용 프로그램입니다. 유휴 상태에있는 동안 많이 진행되는 것은 아닙니다.

그래서 나는 이것을 더 자세히 살펴보기 시작했습니다. 재현 가능합니다. 메모리 소비는 시간이 지날수록 커다란 점프에서 감소하기 시작합니다. ca. 50 분 그것은 32.1 MB에 도달했다!

.NET 가비지 수집기 성능 카운터를 모니터링했지만 크게 변경되지 않았습니다. 따라서 나는 Delphi 측에 문제가 있다고 의심한다 -> FastMM을 가리킨다.

저는 FastMM에 익숙하지 않습니다. 나는 확실히했고 FullDebugMode는 활성화되지 않았다. 다른 사람이 이와 같은 것을 경험 했습니까? FastMM에서 잘못 구성 될 수있는 힌트/아이디어가 있습니까?

감사합니다.

+0

@DavidHeffernan 당신은 Delphi-Memory Manager에 관한 많은 경험이있는 것 같습니다. :-). 유사한 경험이 있다면 의견을 말할 수 있다면 매우 감사 할 것입니다. 고마워! – santiagoIT

+4

여기에 특정 사용자에게 질문 할 수는 없으며 가장 먼저 주석을 달거나 답변에 의견을 표기하지 않는 한 @ 표기법을 사용하여 핑 (ping) 할 수 없습니다. 이것은 소셜 미디어 사이트가 아니므로 원하는 사용자로부터 개인 기술 지원을받지 못합니다. –

+0

@KenWhite 정보 주셔서 감사합니다! 알아 둘만한. 잘하면 그는이 질문에 부딪 힐 것이다.나는 데이빗이 자신의 MemoryManager를 사용하고 몇 가지 시도해 보았습니다. 따라서 그의 의견은 매우 가치있을 것입니다. – santiagoIT

답변

1
  1. OS가 때때로 다른 응용 프로그램을 무료로, 유휴 응용 프로그램의 사용하지 않는 RAM을 식별, 다음 앱에서 소비되는 자원에 더 이상 계산되지 않습니다.

  2. 그런 하이브리드 응용 프로그램에서 대부분의 메모리는 가비지 수집기에서 .Net 프레임 워크에 의해 예약됩니다. GC는 유휴 모드에서 실행되고 메모리를 압축/압축합니다. 무슨 일이 있었는지도 모른다. 앱의 일부 로그를 monitor the actual FastMM4 heap consumption에 추가하십시오.

  3. 메모리 누수가있을 수 있으며 32 비트 프로세스의 2GB 제한에 도달했습니다. set the 3GB flag for the exe을 시도하십시오. 또는 64 비트 실행 파일로 전환하면 .Net 코드가 행복해집니다. 앱이 안전한지 확인하려면 FastMM4 in memory leak reporting mode을 실행하십시오.