Asp .net core内存管理机制

注意:在垃圾回收触发时,除了触发垃圾回收的线程外所有的其他线程都会挂起状态

分类:

主要分为server GC workstation GC

Server GC

默认值

用于多核系统,它为每个处理器创建一个GC Heap,并进行并发执行会后操作(在.net framework4.5之前,concurrent这个是默认的,在之后用backgroud替代了)。

特点:初始分配内存大(每个cpu都要分配,它占用内存多),同时该模式认为内存就是用的,不占用就有浪费的行为,同时频繁GC会造成系统资源的浪费,所以,基本上它是有多少内存占用多少内存。

使用场景:服务器上应用少,吃内存的应用

Workstation GC:

workstation GC 发生在触发在用户线程上,用户线程通常是以普通优先级运行,所以该模式下垃圾回收器必须与其他线程竞争CPU时间,当然他不会挂起运行本机代码的线程,但是会引发其他线程的hang住。

它可以是并发模式,也可以禁用并发模式。

使用场景:服务器上应用多,同时需要禁用并发垃圾回收。原因:减少cpu上下文切换,提高机器性能。

这里提一下后台workstation GC

后台workstation GC :后台工作垃圾回收期间对01代的回收称为前台垃圾回收,前台垃圾回收时,所有托管线程都将被挂起。

         当后台垃圾回收正在进行并且你已在第 0 代中分配了足够的对象时,CLR 将执行第 0 代或第 1 代前台垃圾回收。

         专用的后台垃圾回收线程将在常见的安全点上进行检查以确定是否存在对前台垃圾回收的请求。

         如果存在,则后台回收将挂起自身以便前台垃圾回收可以发生。 在前台垃圾回收完成之后,专用的后台垃圾回收线程和用户线程将继续。

后台server GC 后台服务垃圾回收:这个是默认的模式,与后台workstation GC功能类似。与workstation GC后台工作垃圾回收区别:一个是多线程,一个是专用的后台垃圾回收线程。

 

 

 

应用

Docker场景

请使用workstation GC模式,即将server GC设置为false即可。

如果用server GC可能会出现容器一直频繁重启的问题(一直达到内存最大分配值)。

 

参考文档:

https://blog.markvincze.com/troubleshooting-high-memory-usage-with-asp-net-core-on-kubernetes/

https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals