Mam web API stworzone z template dla .net core 2.1 z targetem na net framework (taki tam pokemon).
Używam tutaj dodatkowo biblioteki/zestawu bibliotek, co działa tylko pod .net framework.
W kontrolerze wywołuję jedną metodę z tej biblioteki. Po każdym wywołaniu widać, jak zapycha się pamięć, która nie chce się zwalniać. Po kilkunastu razach wywala się wyjątek OutOfMemoryException.
Użyłem DotMemory i wychodzi na to, że coś się chrzani w tej bibliotece.
Natomiast jak użyję tej biblioteki w apce konsolowej, to mogę nawet wywołać tę metodę setki razy i nic się nie stanie, pamięć ładnie się zwalnia.
Co do biblioteki, to robi duużo rzeczy na bazie danych.
Na swój chłopski rozum tego nie ogarnę -,-
#programowanie #csharp #dotnet
Besteer

A usingi kolega dobrze i wszędzie porobił? Połączenia z DB są niezarządzane i sam musisz pamiętać o zwolnieniu zasobów. Requesty nie za długo idą? Bo każdy nowy to nowy wątek i nowa instancja połączenia.

Ewentualnie ręcznie GC.Collect spróbuj , może pomoże, chociaż to już hardcore i antywzorzec, uważaj na to.

Dissociated

@Besteer Po mojej stronie nie ma nawet gdzie wykorzystać usingów. Cały kod odpowiedzialny za komunikację z bazą jest po stronie biblioteki.

Co do requestów to maksymalnie kilkanaście sekund.

Próbowałem właśnie z GC.Collect i to nawet nie pomoglo...

Besteer

@Dissociated masz kod tej biblioteki? Jak nie, to można zdekompliować IL Spy jakimś

Dissociated

@Besteer Kodu nie mam, dekompilowałem, ale ciężko było się w tym połapać. Zrobili tam coś w rodzaju nakładki na EF, gdzie wszystko, co się da, jest generyczne.


Próbowałem gadać z ludźmi od tej biblioteki i pewnie skończy się to na tym, że będę musiał im wysłać cały kod aplikacji...

Besteer

Ty mi jeszcze powiedz, a nie robisz czasem tak, że tę bibliotekę inicjalizujesz/tworzysz instancję w kontrolerze (czyli za każdym requestem)? A w konsoli raz i tylko wywołujesz? Potem każdy request to nowa instancja, niektóre libki i to nawet te od Microsoftu, składniki .NETa tego nie lubią. Wrzuć w DI jako serwis typu Singleton (jedna instancja per apka na wszystkie requesty) i zobacz, co będzie się działo.

Dissociated

@Besteer Inicjalizację w obydwu przypadkach robię tylko raz. DI używam od zawsze, z singletonem bez zmian

Besteer

@Dissociated a co to za biblioteka w ogóle?

Dissociated

@Besteer jest to tak zwana Sfera dla Subiekta nexo

Besteer

@Dissociated oho, coś niszowego. Jeszcze jest taka opcja, że to coś robi wątki w środku, a ASP .NET nie ma na to referencji i nie zamyka przy zamykaniu requesta, ale to by było dziwne. Wersji Core tego Subiekta też pewnie nie ma?

Obawiam się, że bez zobaczenia tego więcej nie pomogę.

Dissociated

@Besteer Tam pod spodem to się każda dziwna magia może dziać.

Wersji Core niestety nie ma.

Jakbyś chciał coś więcej pomóc, to pewnie bez poznania jak to tam wszystko działa, nie obeszłoby się. A to już sensu nie ma totalnie.

Dissociated

@Besteer Dzięki za próbę pomocy

Besteer

@Dissociated nie ma za co. Temat niestety za głęboki na ogólne porady.

NullReferenceException

@Dissociated @Besteer spróbuj zrobić bibliotekę/wrapper jako class library w dotnet standard na tę bibliotekę subiekta i dopiero tę swoją podepnij do dotnet core. Może to coś pomoże.

Spróbuj też owinąć to jakimś interfejsem i rejestrować w DI jako scoped. Może to rozwiązać wycieki pamięci bo będzie go regularnie GC sprzątał i DI Ci będzie tworzył nową instancje dla każdego requesta. Trzeba sprawdzić jaki impact na bazę w takim rozwiązaniu bo możesz zamienić jeden problem na drugi.

Jeśli coś w bibliotece jest zjebane z zarządzaniem obiektami to może któryś z tych patentów pomóc.

Besteer

@NullReferenceException @Dissociated jak już idziemy w .NET Standard, to przy okazji może podbij to do .NET 6/7? Może być stary bug dawno rozwiązany w nowszej wersji. Spróbuj też zrobić kompletnie nowy, osobny projekt ASP .NET Core, podpiąć tylko tę problematyczną bibliotekę i w takiej absolutnie minimalnej konfiguracji sprawdź, czy też jest to samo. Może u siebie w kodzie masz coś źle i koliduje?

Zaloguj się aby komentować