Saltar al contenido

¿Por qué ASP Net Core 2.2 no libera memoria?

Nuestro grupo de trabajo ha estado largas horas buscando para darle soluciones a tu pregunta, te dejamos la respuesta por eso deseamos serte de mucha ayuda.

Solución:

Puede parecer que ASP.NET Core usa más memoria de la que debería porque está configurado para usar Server GC de forma predeterminada (a diferencia de Workstation GC). Para una discusión de una preocupación similar ver aquí. En teoría, la aplicación debería poder reducir su huella de memoria cuando su servidor enfrenta una presión de memoria.

Más sobre este tema en este documento de MSDN y el documento de Github CoreCLR.

Para ver si es el servidor GC el que causa el consumo de memoria adicional, puede configurar la estrategia GC en la estación de trabajo en su archivo csproj:

 
    false

Estaba luchando con el mismo problema. Después de investigar un poco, descubrí que .NET Core asigna nuevo espacio de memoria si puede. Se lanzará si es necesario, pero esta versión requiere más recursos que las otras versiones, porque debe usar el GC de esta manera:

GC.Collect(2, GCCollectionMode.Forced, true);
GC.WaitForPendingFinalizers();

Mi solución fue crear un middleware:

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace RegisterValidator

    public class GCMiddleware
    
        private readonly RequestDelegate _next;

        public GCMiddleware(RequestDelegate next)
        
            _next = next;
        

        public async Task Invoke(HttpContext httpContext)
        
            await _next(httpContext);
            GC.Collect(2, GCCollectionMode.Forced, true);
            GC.WaitForPendingFinalizers();
        
    

EDITAR: este middleware proporcionará una GC.Collect después de cada llamada.

y registrarlo en el Configure() método en Startup.cs:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider service, ILoggerFactory loggerFactory)
    

        app.UseMiddleware();
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        
        else
        
            app.UseHsts();
        

        app.UseStaticFiles();
        //app.UseHttpsRedirection();
        app.UseMvcWithDefaultRoute();

        app.Run(async (context) =>
        
            await context.Response.WriteAsync(""No ");

        );
    

Tal vez haya otra solución, pero aún no la he encontrado. Espero que ayude.

Editar: Si no está seguro de que el uso de la memoria se deba a que hay una gran cantidad de espacio asignado de algún otro problema, puede usar dotMemory que generará un perfil del uso de la memoria con más detalle que su Visual Studio.

Te mostramos reseñas y calificaciones

Tienes la opción de añadir valor a nuestro contenido dando tu experiencia en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *