У меня есть проект, использующий Microsoft.SqlServer.Types , который приводит к утечке памяти и замедляет работу при ретаргетинге с net472 на netcoreapp3.1.
Я знаю, что netcoreapp3.1 не обязательно может запускать dll netfx, но я попытался просто посмотреть, сработает ли это.
Я наблюдаю две вещи:
- Использование памяти медленно, но неуклонно растет.
- netcoreapp3.1 достиг 500 МБ (и продолжает увеличиваться), где net472 стабильно около 15 МБ
- Звонки на
ShortestLineTo
, похоже, становятся все медленнее и медленнее, поскольку программы работают дольше. - net472 довольно стабилен примерно за 2500 мс, тогда как netcoreapp3.1 запускается в сопоставимое время, но через некоторое время увеличился до 4500 мс.
internal static class Program
{
private static void Main()
{
var point = SqlGeography.Point(0, 0);
var sw = Stopwatch.StartNew();
while (true)
{
for (int i = 0; i < 100_000; i++)
{
point.ShortestLineTo(point);
}
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
}
}
}
https://github.com/dotnet/runtime/issues/353 упоминает утечку памяти для Marshal.GetFunctionPointerForDelegate
, но я не уверен, является ли это тем же случаем.
Запуск Concurrency Visualizer дал этот существенный след ,
Я создал меньший пример, который извлекает соответствующие части из nupkg и вызывает неуправляемую dll. https://gofile.io/?c=hfAKwe
Редактировать 2020-03-20:
Попытка запустить ту же программу с новым выпуском. Net 5.0 preview1 и теперь использование памяти и процессора стабилизировалось.