Утечка памяти при вызове неуправляемого кода из ядра net - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть проект, использующий 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 дал этот существенный след , Concurrency Visualizer dump

Я создал меньший пример, который извлекает соответствующие части из nupkg и вызывает неуправляемую dll. https://gofile.io/?c=hfAKwe

Редактировать 2020-03-20:

Попытка запустить ту же программу с новым выпуском. Net 5.0 preview1 и теперь использование памяти и процессора стабилизировалось.

...