2010-06-02 3 views
3

우리는 가상 메모리가 증가하고 하루 이상 지속되는 응용 프로그램을 가지고 있습니다. 2 일 후 약 500MB로 올라갔습니다. 데이터베이스를 공격하는 애플리케이션뿐만 아니라 HTTP 및 비누 요청을 많이 생성하는 애플리케이션을 프로파일 링하려고 시도했지만 Fastmm4는 누출이 없음을 보여줍니다.Fastmm4를 사용할 때 가상 메모리 문제는 언제 발생합니까?

메모리가 청구되는 방법 및시기와 상승하는 가상 메모리에 문제가 있는지 확실하지 않습니다.

JD

답변

7

"누수"메모리가 아니며 "누설"상태 일 수 있습니다. 응용 프로그램이 메모리를 해제 할 수 없으면 메모리는 누출되지 않습니다. 예 : 포인터가 사라진 후에.

개체가 만들어지고 개체가 소멸 될 때 해제 될 때 메모리가 요구됩니다 (개체가 새 개체로 덮어 쓰면 손실됩니다). 누출은 메모리가 해제되지 않는 경우입니다 (응용 프로그램을 닫은 후). 응용 프로그램 실행 중에 해제되지 않는 개체의 경우 일 수 있습니다. 그러나 개체가 목록 또는 개체 배열에 추가되면 목록/배열은 계속 증가합니다 (덮어 쓰기 대신). 개체가 응용 프로그램이 닫힐 때까지 자동으로 해제되는 응용 프로그램이지만 응용 프로그램이 종료 될 때까지는 응용 프로그램이 닫히지 않을 때 FastMM은 메모리가 유출되지 않았기 때문에 아무 것도보고하지 않습니다 (응용 프로그램을 닫을 때 모두 freeed되었습니다)

메모리 프로파일 러는 현재 메모리에있는 각 객체의 수와 Objects 클래스 (이 작업을 수행하는 AQ Time도 사용합니다). 1 시간/2 시간/3 시간 후에 메모리 프로파일을 확인해야합니다. 대부분의 장기 실행 애플 리케이션 (내가 아는 모든 것)은 상당히 일정한 (장기적인) 메모리 요구 사항을 가지고 있으며, 메모리에있는 각 오브젝트도 상당히 일정하게 유지됩니다. 분명히 애플 리케이션이 바쁠 때 스파이크가있을 것이지만 이들은 안정된 수준으로 되돌아 와야합니다. 개체 수가 지속적으로 증가하는지 확인하십시오.

내 생각 엔 폼이나 응용 프로그램이 부모 인 상태에서 응용 프로그램을 동적으로 만들거나, 목록의 끝에 추가하고, 해제하지 않는 것입니다. 앱이 닫힐 때까지 개체가 메모리에 있지만 새 개체마다 더 많은 메모리가 필요합니다.

+0

고맙습니다. JamesB. 나는 AQ Time을 다운로드하고 그것이 더 많은 정보를 제공하는지 확인합니다. –

+0

getheapstatus의 문제점은 무엇입니까? –

+1

"누출은 메모리가 절대로 해제되지 않은 경우입니다. (응용 프로그램을 닫은 후)"- 버그가있는 드라이버 나 별도의 응용 프로그램 (예 : 응용 프로그램)을 사용하지 않고 합리적으로 현대적인 OS에서 가능하지 않다고 생각합니다. 그 응용 프로그램과 대화하여 누수를 유발합니다.) 프로세스가 종료되면 할당 된 모든 메모리가 해제됩니다. –

3

어떤 유형의 객체가 한 지점에 할당되었는지 추적하거나 할당 된 객체를 덤프 할 수있는 도구를 직접 만들 수도 있습니다. 홍보하고 싶지는 않지만 AQTime을 꽤 성공적으로 사용하고 있습니다.

3

마지막으로 중요한 것은 힙 조각화 문제 일 수 있습니다. 이것은 FastMM4의 가능성이 훨씬 적지 만 어쨌든 그것을 검사하는 것이 현명 할 수 있습니다.

가장 쉬운 해결책은 앱의 어딘가에 heapmanager (getheapstatus)의 통계를 기록하고 FreeBig 및 FreeSmall이 누락 된 메모리의 대부분이 아닌지 확인하는 것입니다. 그렇다면 heapfragmentation이 주요 문제입니다.

Totalallocated 필드에는 프로그램에서 사용하는 메모리의 양이 포함됩니다. 이 값이 높으면 메모리를 사용하지만 시스템을 종료 할 때 메모리를 확보해야합니다.

주기적으로 일부 정보를 메모 또는 tstringlist에 로깅합니다.

종료하는 동안 전체적으로 할당 된 일부 로깅은 메모리가 남아있는 위치를 식별하는 데 도움이 될 수 있습니다.

3

Win2008의 중간 계층 서버와 비슷한 문제가있었습니다.

혹시 당신은 윈도우 2008 서버 (또는 Win7에)에 MDAC (ADO)를 사용하여 연결을 많이 수행하는 경우, 는 연결 정보 스크럽는 MS의 코드에서 누수가있다.

보낸 사람 MS : "연결 문자열에서 암호 같은 것을 제거하는 데 사용되는 일부 보안 코드에서 누수가 발생합니다."Persist Security Info = true "연결 문자열에 다음을 포함 할 수 있습니다. . "

관련 문제