내 애플리케이션 (C #으로 작성)은 지난 몇 달 동안 괜찮 았지만 지난주 갑자기 메모리 누수가 발생하기 시작했습니다. 나는 그것을 다시 빌드하지 않았고 바이너리는 동일합니다!
근본 원인을 찾으려고 노력했지만 나중에 Thread memory leak 에서 찾은 것과 동일한 테스트 응용 프로그램을 사용하게되었습니다 . 그래서 저는 Hans가 제안한 솔루션을 복사하여 실행했습니다. 메모리 누수가 지속되었습니다. GC.Collect ()를 추가하면 GC가 각 호출에서 할당 된 메모리의 일부를 복구했기 때문에 메모리 증가가 재기 만하게되었습니다.
프로파일 러로 확인한 결과 스레드와 관련된 항목을 제외하고 다른 모든 관리 또는 관리되지 않는 개체가 올바르게 완료되었습니다.
class Program
{
static void test()
{
}
static void Main(string[] args)
{
int cnt = 0;
while (true)
{
Thread test_thread = new Thread(() => test());
test_thread.Start();
if (++cnt % 256 == 0) GC.Collect();
Thread.Sleep(20);
}
}
}
그런 다음 위의 동일한 테스트 코드를 다른 PC에서 시도했는데 (놀랍습니다!) 완벽하게 작동하고 메모리 누수가 전혀 없었습니다.
업데이트 :이 주제에서 영감을 얻었습니다 . 다른 대상을 위해 많은 스레드를 만들 때 Net Memory Leak . x64 대상을 사용하면 테스트 응용 프로그램의 문제가 해결되는 것 같습니다. 불행히도 내 실제 프로젝트에는 다시 빌드 할 수없는 타사 하위 프로젝트가 포함되어 있습니다.
따라서 내 PC에서 문제가 발생하여 GC가 제대로 작동하지 않는 것 같습니다. 무엇을 확인하고 어디를 볼지 제안 해 주시겠습니까? 미리 감사드립니다.
해결책은 많은 쓰레드를 생성 할 때 .Net Memory Leak에 대한 주석에있었습니다 . Windows 안전 모드에서 누수가 없는지 확인했습니다. 그런 다음 일반 모드에서 중요하지 않은 프로세스를 종료하기 시작했습니다. 바이러스 백신 프로세스는 Hans Passant가 제안한대로 트릭을 수행했습니다. 감사!
내 응용 프로그램이 다시 작동하지만 PC는 보호되지 않습니다. 또한 설명도없고 배울 교훈도 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다