저는 .NET으로 작성된 흐름 제어 시스템을 사용하여 시스템이 TCP 연결을 통해 외부 시스템과 상호 작용하고 서로 다른 끝점간에 트랜잭션을 라우팅합니다.관리되지 않는 코드가 메모리를 특정 한도까지 증가시키는 이유는 무엇입니까?
내 문제 : 시작시
/초기화가 개인 작업 설정 메모리 수준에 대한 2만5천킬로바이트입니다. 시스템이 유휴 상태 일 때 초기화한 후 개인 작업 세트는 약 57000KB의 한계에 도달 할 때까지 초당 50-100KB 정도의 속도로 스테핑 업합니다.
정보 : 점진 동안
시스템이 생성되는 페이지 폴트.
한계에 도달하면 개인 작업 세트가 매우 안정적으로 유지되고 +300 개의 클라이언트를 연결하고 고주파 트랜잭션을 몇 시간 동안 교환 할 때 수 MB로 위아래로 진동하므로 가비지 수집 논리가 작동합니다 아주 잘.
"Memory Profiler"라고 불리는 Redgate의 도구로이 시스템을 프로파일 링했습니다. 초기화되지 않은 코드에 의해 초기화가 할당 된 이후에 메모리가 올라간다는 것을 알려줍니다. 불행하게도이 프로파일 러는 관리되지 않는 코드에 의해 할당 된 메모리에 대한 통찰력을 지원하지 않습니다. 할당 된 메모리가 무엇을 포함하고 있는지, 할당 된 이유 및 메모리를 할당하는 코드를 찾는 데 어려움이 있습니다.
전체 코드베이스는 C#에서 개발되었으며 COM + 어셈블리에 대한 참조가없고 기본 Windows API와의 통신이 없습니다 (이 메모리 증분 중).
내 질문 : I 메모리가 지속적으로 초기화 한 후 특정 레벨에 작은 덩어리에서 증가하는 이유를 찾아 올바른 방향으로 지적 될 필요가
.
_ "TCP 연결을 통해 [...] 네이티브 windows API와의 통신이 없습니다."- 당신이있는 동안 WinSock을 다시 빌드 했습니까? ;-) – CodeCaster
이 메모리가 증가하는 동안 네이티브 API와의 통신이 없습니다 (내 질문은 해당 정보로 수정되었습니다). – tost
@Tobias [_.Net Memory Profiler_] (http://memprofiler.com/)를 사용해보십시오. 관리되지 않는 메모리를 추적 할 수 있으며 무료 평가판을 사용할 수 있습니다. – Dzienny