Obwohl der Garbage Collector (GC) läuft, bleibt der Speicher oft innerhalb des Prozesses als freier Speicher zugewiesen, wird aber nicht an das Betriebssystem zurückgegeben. Dieses Verhalten führt zu einer hohen Speichernutzung über alle Prozesse hinweg und einige Anwendungen lösen schließlich eine OutOfMemoryException aus.
Außerdem erreicht die Generation 0 vor der Ausführung des GC häufig erhebliche Größen, manchmal sogar Hunderte von Megabyte mehrere Gigabyte. Diese übermäßige Speichernutzung führt zu großen Leistungsproblemen, und ich brauche eine Lösung, um die Speichernutzung zu optimieren, .NET 8-Anwendungen zu zwingen, ungenutzten Speicher effektiver freizugeben und diese Probleme zu mildern.
Die Anwendungen verwenden EF Core 8.0.11 (nur Lesen). DbContext ist als bereichsgebunden registriert.
Ich habe es mit einer neuen .NET 8-Anwendung mit einem einzigen Controller getestet
Code: Select all
[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();
}
}
Code: Select all
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();
Code: Select all
net8.0
enable
enable
TestApi
GD0001
runtime; build; native; contentfiles; analyzers; buildtransitive
all
Code: Select 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; }
}

Do Haben Sie Empfehlungen zur Verbesserung der Speicherverwaltung oder zur Konfiguration des GC, um dieses Szenario besser zu bewältigen? Oder vielleicht ist ein Code in meiner App falsch.