在我们众多的微服务项目中,都有限制其堆内存大小的需求,以免占用宿主机内存过高。
在java中我们可以通过jvm参数来很好的控制堆内存以及其他参数。
但是在asp.net core的web服务中,我们该如何去限制堆内存大小呢?
提示:以下是本篇文章正文内容,下面案例可供参考
微软旗下支持跨平台的开发框架,与springboot思想类似,支持ioc等,可以快速的开发web api等项目官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-6.0
建议熟读官方文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/
官网文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/#runtimeconfigjson
.NET 提供了以下机制用于配置 .NET 运行时的行为:
runtimeconfig.json 文件MSBuild 属性环境变量通过使用环境变量来配置某个选项会将设置应用于所有的 .NET 应用。 在 runtimeconfig.json 或项目文件中配置某个选项则只会将设置应用于该应用程序。
选择 runtimeconfig.json
文件作为.net运行时的配置文件。
构建项目时,将在打包的输出目录中生成 [appname].runtimeconfig.json 文件。
如果项目文件所在的文件夹中存在 runtimeconfig.template.json 文件,它包含的任何配置选项都将插入到 [appname].runtimeconfig.json 文件中。
如果自行构建应用,请将所有配置选项放在 runtimeconfig.template.json 文件中。 如果只是运行应用,请将其直接插入 [appname].runtimeconfig.template.json 文件中。
示例:限制堆内存最大为1G
{"configProperties": {"System.GC.HeapHardLimit": 1073741824}}
测试控制器:
[Route("api/[controller]/[action]")][ApiController]public class TestController : ControllerBase{[HttpGet]public void testMemory(){List<byte[]> bytesList = new List<byte[]>();while (true){Console.ReadKey();// 100mfor (int i = 0; i < 100; i++){// 1mbbyte[] bytes = new byte[1024 * 1024];bytesList.Add(bytes);}Console.WriteLine("当前堆内存大小 -- " + GC.GetTotalMemory(false) / 1024 / 1024.0 + " MB");}}}
结果,可见配置生效,达到1g时报错 System.OutOfMemoryException,然后系统强行gc,服务down,配置docker-compose的自动重启即可完成gc后自动重启
当前堆内存大小 -- 102.0029296875 MB当前堆内存大小 -- 202.013671875 MB当前堆内存大小 -- 302.0166015625 MB当前堆内存大小 -- 402.0126953125 MB当前堆内存大小 -- 502.0166015625 MB当前堆内存大小 -- 602.02734375 MB当前堆内存大小 -- 702.044921875 MB当前堆内存大小 -- 802.046875 MB当前堆内存大小 -- 902.0498046875 MBinfo: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]Executed action office_conver_server.Controllers.TestController.testMemory (office-conver-server) in 5924.7612msinfo: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]Executed endpoint 'office_conver_server.Controllers.TestController.testMemory (office-conver-server)'fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]An unhandled exception has occurred while executing the request.System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at office_conver_server.Controllers.TestController.testMemory() in D:BaiduSyncdisk项目目录ItemProjectsdotnetoffice-conver-serverControllersTestController.cs:line 49 at Microsoft.Extensions.Internal.ObjectMethodExecutor.<>c__DisplayClass33_0.<WrapVoidMethod>b__0(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.VoidResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync() at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()--- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()--- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker) at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
可以采用上述配置,但是缺点就是不灵活,需要频繁更新代码,更新容器。。。
添加容器环境变量DOTNET_GCHeapHardLimit: "value"
注意value是十六进制
version: "3"services:officeConverServer:image: l-4.1-office-conver-server:testports:- 8079:80volumes:- ./uploadFile:/uploadFile#- ./office-conver-server.runtimeconfig.json:/app/office-conver-server.runtimeconfig.json- ./appsettings.json:/app/appsettings.jsonenvironment:# 堆内存最大限制【十六进制】DOTNET_GCHeapHardLimit: "40000000"TZ: Asia/Shanghai # deploy: #resources:# limits: #memory: 1Grestart: alwayssecurity_opt:- seccomp:unconfined
到此这篇关于asp.net core服务限制堆内存大小的文章就介绍到这了,更多相关asp.net core堆内存大小内容请搜索一聚教程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持一聚教程网!