Хотя сборщик мусора (GC) работает, память часто остается выделенной внутри процесса как свободная память, но не возвращается в ОС. Такое поведение приводит к интенсивному использованию памяти процессами, и некоторые приложения в конечном итоге выдают исключение OutOfMemoryException.
Кроме того, перед запуском GC поколение 0 часто вырастает до значительных размеров, иногда достигая сотен мегабайт или даже несколько гигабайт. Чрезмерное использование памяти вызывает серьезные проблемы с производительностью, и мне нужно решение, позволяющее оптимизировать использование памяти, заставить приложения .NET 8 более эффективно освобождать неиспользуемую память и смягчить эти проблемы.
Приложения используют EF Core 8.0.11 (только чтение). DbContext зарегистрирован как ограниченный.
Я тестировал его с новым приложением .NET 8 с одним контроллером
Код: Выделить всё
[Route("/api/test")]
public class TestController(IDbContextFactory dbContextFactory) : ControllerBase
{
[HttpGet]
[Route("GetSpeakers")]
public List GetSpeakers()
{
using var dbContext = dbContextFactory.CreateDbContext();
return dbContext.Speakers.AsNoTracking().OrderBy(s => s.Name).ThenBy(s => s.Id).ToList();
}
}
Код: Выделить всё
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services
.AddDbContextPool(
options => options.UseSqlServer("Server=localhost;Database=TestDb;Trusted_Connection=True;TrustServerCertificate=True;"))
.AddPooledDbContextFactory(
options => options.UseSqlServer("Server=localhost;Database=TestDb;Trusted_Connection=True;TrustServerCertificate=True;"));
var app = builder.Build();
app.UseRouting();
app.MapControllers();
app.Run();
Код: Выделить всё
net8.0
enable
enable
TestApi
GD0001
runtime; build; native; contentfiles; analyzers; buildtransitive
all
Код: Выделить всё
public sealed class Speaker
{
public int Id { get; init; }
[StringLength(200)]
public required string Name { get; init; }
[StringLength(4000)]
public string? Bio { get; init; }
[StringLength(1000)]
public string? Website { get; init; }
}

Делать У вас есть какие-либо рекомендации по улучшению управления памятью или настройке GC для лучшей обработки этого сценария? Или, возможно, какой-то код в моем приложении неправильный.
Подробнее здесь: https://stackoverflow.com/questions/793 ... is-with-ef
Мобильная версия