엔터티 프레임 워크 메모리가 해제되지 않았습니다.

c# entity-framework entity-framework-6

문제

Entity Framework 6.0.2, .NET 4.5.1에서 아주 간단한 asp.net mvc 응용 프로그램을 사용하고 있습니다.

public class HomeController : Controller
{
   public ActionResult Index()
   {
      int count;
      using (var db = new LocalContext())
      {
         count = db.Counters.Count();
      }
      return View(count);
   }
}

public class Counter
{
   public int Id { get; set; }
}

public class LocalContext : DbContext
{
   public DbSet<Counter> Counters { get; set; }
}

로드 테스트를 수행하면 메모리 부족 예외가 발생합니다. ( tinyget -srv:localhost -port:<port> -uri:/home/index/ -threads:30 -loop:5000 ). 성능 모니터에서 제 2 세대 힙이 꾸준히 증가하는 것을 봅니다. 작은 루프 값 (예를 들어 500)을 사용하면 tinyget이 멈출 때까지 크기가 커집니다. 그런 다음 힙 크기는 동일하게 유지됩니다 (최소 20 분 동안 서버를 중지 한 후).

내가 도대체 ​​뭘 잘못하고있는 겁니까?

편집하다

그래서 Simon Mouriers의 제안을 시도하고 EF 코드를 생략했습니다. 그렇다면 기억에 문제가 없습니다. 그래서 Debug 대신 Release를 사용하면 차이가 생길 수 있습니다. 그리고 그랬다! 잠시 후에 메모리가 해제되었고 사이트에 높은 부하를 걸 수있었습니다. 그런 다음 디버그 모드로 전환하여 더 많은 정보를 얻을 수 있는지 확인하고 디버그 모드에서도 더 이상 문제가 없는지 확인합니다. FML, 나는 그것에 하루 종사하고 지금은 더 이상 그것을 재현 할 수 없습니다.

인기 답변

귀하의 경우 DbContext에서 상속받은 내부 관리 클래스는 IDisposable을 구현하고 LocalContext 내부에 다음을 추가해야합니다.

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
     if (disposing)
     {
        // Manage any native resources.
     }
   //Handle any other cleanup.
}

dispose 호출을 명시 적으로 오버라이드하지 않고 using 문은 상위 클래스와 하위 클래스를 삭제해야하는 동안 기본 클래스에 대해서만 Dispose ()를 호출합니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.