2013-02-20 4 views
6

큰 ASP.net 4.0 웹 사이트를 실행 중입니다. 인기있는 .Net 콘텐츠 관리 시스템을 사용하고 수천 개의 콘텐츠 항목, 수백 명의 동시 사용자가 있습니다. 기본적으로 무거운 웹 사이트입니다.RedGate 메모리 프로파일 러를 사용하여 ASP.net에서 메모리 누출 이해

하루 동안 IIS7 작업자 프로세스의 메모리 사용량은 8-10GB까지 증가 할 수 있습니다. 서버는 16GB가 설치되어 있으며 현재 하루에 한 번 응용 프로그램 풀을 재활용하도록 설정되어 있습니다.

메모리 사용량을 줄이려고 압력을 받고 있습니다. 대부분의 메모리 사용량은 대량의 데이터를 캐싱하기 때문에 발생하지만 캐시 간격은 5 ~ 10 분으로 설정되므로 결국이 문자열은 메모리에서 만료됩니다.

그러나 RedGate Memory Profiler를 실행 한 후 메모리 누수가 무엇인지 알 수 있습니다. 인스턴스 목록 결과를 "폐기 된 객체 만 메모리에 보관"된 객체로 필터링했습니다 (RedGate 포럼에서 메모리 누수를 찾는 방법을 읽었습니다). 이것은 나에게 메모리에 보관되어있는 문자열의 긴 목록을 주었다.

각 문자열에 대해 인스턴스 보유 그래프를 사용하여 메모리에 무엇이 들어 있는지 확인합니다. System.string 개체는 System.Web.Caching.CacheDependency에 의해 어느 시점에서 캐시 된 것 같습니다. 그래프를 따라 가면 System.Web.FileMonitor에 도달 할 때까지 System.Collections.Specialized.ListDictionary를 비롯한 여러 다른 클래스를 거칩니다. 이것은 문자열이 파일 (이미지/PDF/etc)에 대한 경로이기 때문에 의미가 있습니다.

CMS가 파일에 대한 경로를 캐싱하고 있지만 이러한 캐싱 된 개체가 "유출"된 것으로 보입니다. 시간이 지남에 따라 이것은 RAM을 구축하고 먹습니다.

죄송합니다. 오래간만에 ...이 메모리 누수를 막을 수있는 방법이 있습니까? 또는 앱 풀 재활용에 의존하지 않고 삭제할 수 있습니까? 누출 문제를 해결할 수 있는지 알아보기 위해 캐싱을 수행하는 클래스/코드를 찾을 수 있습니까?

답변

0

세션 상태의 일부로 메모리에 남아있는 물건의 매우 일반적인 문제인 것처럼 들립니다. 그 경우 유일한 옵션은 다음과 같습니다. 1. 각 사용자 세션에 많은 것을 넣지 마십시오. 2. 세션 수명을 더 짧게 설정하십시오 (기본값은 20 분입니다). 3. 주기적으로 응용 프로그램 풀 재활용 .

1. 데이터 그리드 컨트롤에 데이터를 표시하는 "좋은 방법"과 "나쁜 방법"이 있음을 발견했습니다. 필요한 데이터 만 복사하고 실수로 전체 DataGrid에 대한 참조를 유지하지 않는지 확인할 수 있습니다.

+0

우리는 이미 앱 풀을 재활용하고 있지만 클라이언트는 해결책이 아닌 해결책으로보고 있습니다. 그들은 칭의와 함께, 응용 프로그램이 너무 많은 메모리를 사용해서는 안된다고 말하고 있습니다. –

+0

'System.Web.Caching.CacheDependency'는 세션의 캐시보다 ASP.NET 캐싱을 사용합니다. 이 캐시는 캐시 키가 사용자별로 (권장하지 않으며 이러한 종류의 문제를 일으킬 수있는 경우)를 제외하고는 모든 사용자에게 정적이며 공유됩니다. 풀을 재활용하거나 세션 타임 아웃을 낮추면 메모리 사용량이 아닌 웹 애플리케이션의 수명이 제한됩니다. – JoeBilly