Утечка памяти в платформе сущностей после отсоединения вновь созданного объекта - PullRequest
1 голос
/ 08 июня 2010

Вот тест:

WeakReference ref1;
WeakReference ref2;

TestRepositoryEntitiesContainer context;
int i = 0;
using (context = GetContext<TestRepositoryEntitiesContainer>())
{
    context.ObjectMaterialized += (o, s) => i++;
    var item = context.SomeEntities.Where(e => e.SomePropertyToLookupOn == "some property").First();
    context.Detach(item);
    ref1 = new WeakReference(item);
    var newItem = new SomeEntity {SomePropertyToLookupOn = "another value"};
    context.SomeEntities.AddObject(newItem);
    ref2 = new WeakReference(newItem);
    context.SaveChanges();
    context.SomeEntities.Detach(newItem);

    newItem = null;
    item = null;    
}
context = null;

GC.Collect();
Assert.IsFalse(ref1.IsAlive);
Assert.IsFalse(ref2.IsAlive);

Первое подтверждение прошло, второе не удалось ... Надеюсь, я что-то упустил, уже поздно ... Но похоже, что отсоединение извлеченного элемента на самом деле освободит все дескрипторы объекта, позволяя его собрать. Однако для новых объектов что-то сохраняет указатель и создает утечку памяти.

NB - это EF 4.0

Кто-нибудь видел это раньше и работал над этим?

Спасибо за вашу помощь!

Tom

1 Ответ

1 голос
/ 08 июня 2010

Вы пытались запустить это с оптимизацией (то есть режимом выпуска) и без отладчика? JIT-компилятор может искусственно продлевать время жизни объекта newItem до конца метода.

Мне удалось воспроизвести проблему при запуске без оптимизации, но не с оптимизацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...