asp.net core服务限制堆内存大小的操作方法

目录
  • 前言
  • 1、asp.net core是什么
  • 2、限制其堆内存最大大小
    • 2.1 设置.NET 运行时的配置
    • 2.2 在项目中创建runtimeconfig.json配置文件
    • 2.2 限制堆的大小
  • 3、测试配置是否生效
  • 4、在docker容器中限制堆内存大小

前言

在我们众多的微服务项目中,都有限制其堆内存大小的需求,以免占用宿主机内存过高。

在java中我们可以通过jvm参数来很好的控制堆内存以及其他参数。

但是在asp.net core的web服务中,我们该如何去限制堆内存大小呢?

提示:以下是本篇文章正文内容,下面案例可供参考

1、asp.net core是什么

微软旗下支持跨平台的开发框架,与springboot思想类似,支持ioc等,可以快速的开发web api等项目
官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-6.0

2、限制其堆内存最大大小

建议熟读官方文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/

2.1 设置.NET 运行时的配置

官网文档:https://learn.microsoft.com/zh-cn/dotnet/core/runtime-config/#runtimeconfigjson

.NET 提供了以下机制用于配置 .NET 运行时的行为:

  • runtimeconfig.json 文件
  • MSBuild 属性
  • 环境变量

通过使用环境变量来配置某个选项会将设置应用于所有的 .NET 应用。 在 runtimeconfig.json 或项目文件中配置某个选项则只会将设置应用于该应用程序。

选择 runtimeconfig.json文件作为.net运行时的配置文件。

2.2 在项目中创建runtimeconfig.json配置文件

构建项目时,将在打包的输出目录中生成 [appname].runtimeconfig.json 文件。

如果项目文件所在的文件夹中存在 runtimeconfig.template.json 文件,它包含的任何配置选项都将插入到 [appname].runtimeconfig.json 文件中。

如果自行构建应用,请将所有配置选项放在 runtimeconfig.template.json 文件中。 如果只是运行应用,请将其直接插入 [appname].runtimeconfig.template.json 文件中。

2.2 限制堆的大小

  • 指定 GC 堆和 GC 簿记的最大提交大小(以字节为单位)。
  • 此设置仅适用于 64 位计算机。
  • 如果已配置每对象堆限制,则忽略此设置。
  • 默认值(仅在某些情况下适用)是 20 MB 或容器内存限制的 75%(以较大者为准)。 此默认值在以下情况下适用:
  • 进程正在具有指定内存限制的容器中运行。
  • HeapHardLimitPercent 未设置。

示例:限制堆内存最大为1G

{
    "configProperties": {
      "System.GC.HeapHardLimit": 1073741824
    }
}

3、测试配置是否生效

测试控制器:

[Route("api/[controller]/[action]")]
[ApiController]
public class TestController : ControllerBase
{
    [HttpGet]
    public void testMemory()
    {
        List<byte[]> bytesList = new List<byte[]>();
        while (true)
        {
            Console.ReadKey();
            // 100m
            for (int i = 0; i < 100; i++)
            {
                // 1mb
                byte[] 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 MB
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[2]
      Executed action office_conver_server.Controllers.TestController.testMemory (office-conver-server) in 5924.7612ms
info: 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\项目目录\ItemProjects\dotnet\office-conver-server\Controllers\TestController.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, Obje
ct[] 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 sta
te, 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)

4、在docker容器中限制堆内存大小

可以采用上述配置,但是缺点就是不灵活,需要频繁更新代码,更新容器。。。

添加容器环境变量DOTNET_GCHeapHardLimit: "value"
注意value是十六进制

version: "3"
services:
  officeConverServer:
    image: l-4.1-office-conver-server:test
    ports:
      - 8079:80
    volumes:
      - ./uploadFile:/uploadFile
      #- ./office-conver-server.runtimeconfig.json:/app/office-conver-server.runtimeconfig.json
      - ./appsettings.json:/app/appsettings.json
    environment:
      # 堆内存最大限制【十六进制】
      DOTNET_GCHeapHardLimit: "40000000"
      TZ: Asia/Shanghai
   # deploy:
    #  resources:
     #   limits:
      #    memory: 1G
    restart: always
    security_opt:
      - seccomp:unconfined

到此这篇关于asp.net core服务限制堆内存大小的文章就介绍到这了,更多相关asp.net core堆内存大小内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core MVC缓存Tag Helpers到内存

    简介 缓存可以大大提高应用程序加载时间和响应速度.我们可以使用缓存Tag Helpers缓存不会频繁更改的HTML内容. 在上一篇文章中,我们谈到了Tag Helpers,演示Tag Helpers能做什么.如何使用它们以及一些最常用的Tag Helpers. 今天,我们将看看如何使用缓存Tag Helpers和它们的益处. Cache Tag Helper 首先说一下 <cache> Tag Helper.与其它Tag Helper不同,其它Tag Helper被当作属性使用,缓存Tag H

  • ASP.NET Core中调整HTTP请求大小的几种方法详解

    一.前言 之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比如路由.认证.会话.缓存等,也同时定制消息处理管道来实现的.我们甚至可以通过管道定制在ASP.NET Core平台上创建我们自己的Web框架,实际上MVC和SingalR这两个重要的Web框架也是采用这样的方式创建的. HTTP协议自身的特性决定了任何一个Web应用的工作方式都是监听.接收

  • ASP.Net Core中的内存和GC机制

    托管代码 在 .NET 中, CLR(Common Language Runtime) 负责提取托管代码并编译成机器语言,然后执行它.在此过程中,CLR 提供自动内存管理.安全边界.类型安全等服务,保证了代码安全. 托管代码指在其执行过程中由 CLR(Common Language Runtime) 管理的代码,托管代码是可在 .NET 上运行得一种高级语言(C#.F#等),编写的托管代码被编译后会被生成 中间语言(IL). CLR 有 .NET Core/.NET5+.Mono..NET Fr

  • Vue.js与 ASP.NET Core 服务端渲染功能整合

    http://mgyongyosi.com/2016/Vuejs-server-side-rendering-with-aspnet-core/ 原作者:Mihály Gyöngyösi 译者:oopsguy.com 我真的很喜欢在前端使用 Vue.js,Vue 服务端渲染直到第二个版本才被支持. 在本例中,我想展示如何将 Vue.js  服务端渲染功能整合 ASP.NET Core. 我们在服务端使用了 Microsoft.AspNetCore.SpaServices 包,该包提供 ASP.N

  • ASP.NET Core服务生命周期

    1.前言 在ConfigureServices方法中的容器注册每个应用程序的服务,Asp.Core都可以为每个应用程序提供三种服务生命周期: Transient(暂时):每次请求都会创建一个新的实例.这种生命周期最适合轻量级,无状态服务. Scoped(作用域):在同一个作用域内只初始化一个实例 ,可以理解为每一个请求只创建一个实例,同一个请求会在一个作用域内. Singleton(单例):整个应用程序生命周期以内只创建一个实例,后续每个请求都使用相同的实例.如果应用程序需要单例行为,建议让服务

  • asp.net Core中同名服务注册的实现代码

    目录 1.使用.net Core自带容器 2.AutoFac中的实现 通常情况下,在使用注入时一个服务接口对应一个实现类,注入方式采用构造函数注入即可,但如果存在多个类实现同一个接口的情况下,则需要根据实际情况来选择不同的实现类. 如以下代码中的MyEmailService和EmailService都实现了IEmailService接口: public class MyEmailService : IEmailService { public string Send(string Email)

  • 基于Java堆内存的10个要点的总结分析

    Java堆内存的10个要点 .javaoutofmemoryerrorgenerationjvmprofiler编程当我开始学习Java编程时,我不知道什么是堆内存或堆空间,我甚至不知道当对象创建时,它们被放在了哪里.当我开始正式写一些程序后,我会经常遇到java.lang.outOfMemoryError的报错,之后我才开始关注什么是堆内存或者说堆空间(heap space).对大多数程序员都经历过这样的过程,因为学习一种语言是非常容易来的,但是学习基础是非常难的,因为没有什么特定的流程让你学

  • 详解Java的堆内存与栈内存的存储机制

    堆与内存优化     今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理.  一.堆和栈 堆-用new建立,垃圾回收器负责回收 1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的底层,向上排列. 2.堆

  • ASP.NET Core 实现基本认证的示例代码

    HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier.login page等标记或载体. - 所有浏览器据支持HTTP基本认证方式 - 基本身证原理不保证传输凭证的安全性,仅被based64编码,并没有encrypted或者hashed,一般部署在客户端和服务端互信的网络,在公网中应用BA认证通常与https结合 http

  • 教你怎么通过IDEA设置堆内存空间

    编写两个可以导致线程阻塞的类并配置堆内存参数 首先需要注意的点:必须要是线程阻塞的类,在jvisualvm.exe程序里面才能够加载这个类的具体信息,jvisualvm.exe后面会提到. 编写两个类,类的main方法,代表两个线程,类具体代码如下图: HeapDemo.java类的代码如下图: HeapDemo3.java类的代码如下图: 然后给这两个类配置堆内存空间,点击Run->Edit Configurations,会跳出来一个弹窗,如下图: 配置好HeapDemo3类的堆内存后,再去配

  • 关于dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库的问题

    目录 背景 使用方法 服务端 客户端 这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源项目提供的基于 NamedPipeStream 命名管道的方式进行通讯.相当于替换掉 ASP.NET Core 的底层通讯方式,从走网络换成命名管道的方式.本库的优势是可以使用设计非常好的 ASP.NET Core 的 MVC 框架作为顶层调用 API 层,底层

  • ASP.NET Core依赖注入详解

    目录 一.什么是依赖注入 二.使用框架提供的服务 三.注册服务 四.生命周期 五.请求服务 六.设计你的依赖服务 ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core应用程序可以利用内置的框架服务将它们注入到启动类的方法中,并且应用程序服务能够配置注入.由ASP.NET Core提供的默认服务容器提供了最小功能集,并不是要取代其它容器. 一.什么是依赖注入 依赖注入(Dependency injection,DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术.将类

随机推荐