.NET Core 两种GC模式:

Server GC / Workstation GC

Server GC :

主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置。它会为每个处理器都创建一个GC Heap,并且会并行执行回收操作。该模式的GC可以最大化吞吐量和较好的收缩性。这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作。用一句简单的话说,这个就是贪婪模式,通过尽可能多的获得内存和少回收来得到更好的性能。结果就是高内存使用率性能较好。

Workstation GC :

主要应用于单处理器系统,Workstation GC尽可能地通过减少垃圾回收过程中程序的暂停次数来提高性能。低负载且不常在后台(如服务)执行任务的应用程序,可以在禁用并发垃圾回收的情况下使用工作站垃圾回收。特点是会频繁回收,来阻止一次较长时间的回收。结果就是低内存使用率性能较差。

简单测试

以下测试结果都在同一台计算机上,配置如下:

  • Windows 7 Ultimate
  • Intel Core I3-3220 @ 3.30 GHZ
  • 8G内存,可用空间3GB
  • SQL Server 2014

被测试的程序是ZKEACMS,首页,单面压力测试,5000个请求,1000个并发。测试结果如下:

Server GC :

响应结果如下,大概167.81 Req/s,这个结果并不是每次都一样,会有所偏差,仅供参考:

内存使用涨到差不多600多M左右,期间会有上下上下浮动,情况如下图所示:

经过反复多次的测试,内存最高时涨到800多M,这与可用内存有关系,如果可用内存更多,还会涨到1G或更高然后再掉下来:

Workstation GC :

响应结果如下图所示,大概151.33 Req/s,看起来是要比Server GC差一点点,并且多次测试结果,总体都是更差些。

内存使用情况一直在200M左右浮动,反复的压力测试,也不会有大的大起大落,这与它积极的回收有关系:

内存回收模式的切换

现在对.Net Core的不同的内存回收模式产生的影响已经有了一定的了解,那就可以看你的个人情况做出选择了。.Net Core默认的贪婪模式可以得到更好的性能,这没有什么问题是,毕竟内存不用放在那也是浪费。当然如果你的服务器上许多的程序在跑,并对内存有较高的限制要求不要影响到其它的程序,那就要做一些配置了。

开发环境

在开发环境,你可以编辑你的项目文件,加上以下配置,重新生成即可:

<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>

生产环境

可以不用修改重新部署,直接到你的程序中找到 *.runtimeconfig.json,如:ZKEACMS.WebHost.runtimeconfig.json,修改"System.GC.Server": false,重启程序即可:

"configProperties": {
"System.GC.Server": false
}

参考资料:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals

原文地址:http://www.zkea.net/codesnippet/detail/post-81

.Net Core内存回收模式及性能测试对比的更多相关文章

  1. tcmalloc jemalloc glibc内存分配管理模块性能测试对比

    tcmalloc是谷歌提供的内存分配管理模块 jemalloc是FreeBSD提供的内存分配管理模块 glibc是Linux提供的内存分配管理模块 并发16个线程,分配压测3次,每次压15分钟,可以看 ...

  2. linux内存回收 内核参数

    ss -atu| awk '/^tcp/{++S[$2]} END {for(a in S) print a,S[a]}' ps up pid (RSS:实际内存大小,长驻内存) ps o pid,c ...

  3. PostgreSQL单机、同步复制、异步复制性能测试对比

    测试环境: •测试机:PC •内存:8GB •CPU:Intel(R) Core(TM) i5-3450 3.10GHz •硬盘:HDD •数据量:20GB •测试工具:pgbench •Postgr ...

  4. (转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

    http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟 ...

  5. 【垃圾回收】Java内存回收实践经验 防止内存报警

    jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...

  6. 2 - JVM随笔分类(JVM堆的内存回收)

    JVM常用的回收算法是: 标记/清除算法 标记/复制算法 标记/整理算法 其中上诉三种算法都先具备,标记阶段,通过标记阶段,得到当前存活的对象,然后再将非标记的对象进行清除,而对象内存中对象的标记过程 ...

  7. Redis内存回收机制

    为什么需要内存回收? 原因有如下两点: 在 Redis 中,Set 指令可以指定 Key 的过期时间,当过期时间到达以后,Key 就失效了. Redis 是基于内存操作的,所有的数据都是保存在内存中, ...

  8. 【垃圾回收-CMS】Java内存回收实践经验 防止内存报警

    jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...

  9. Android内存回收机制

    退出但不关闭: 这是Android对于Linux的优化.当 Android 应用程序退出时,并不清理其所占用的内存,Linux 内核进程也相应的继续存在,所谓“退出但不关闭”.从而使得用户调用程序时能 ...

随机推荐

  1. leetcode442

    public class Solution { Dictionary<int, int> dic = new Dictionary<int, int>(); public IL ...

  2. Hibernate面试问题集锦: 概述

    ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置Hibernate? A.Configuration类使用配 ...

  3. 如何把MyEclipse中的web项目导入到Eclipse中运行

    有时我们需要将MyEclipse中的项目导入到Eclipse中运行,如果不注意到一些细节,会造成无法运行的后果.下面就说说具体操作: 如何导入到Eclipse就不在重述了,导入后出现如下错误: 与上面 ...

  4. elasticsearch must和should组合查询

    {"query": { "bool": { "should": [ {"bool": { "must" ...

  5. vue的样式绑定

    vue在样式绑定,看这官方的文档,怎么试都不行后来看了一篇文章 <div :class="[rankClass]"></div> <script> ...

  6. nodejs中yield的用法?

    nodejs中yield的用法? https://www.zhihu.com/question/32752866?sort=created

  7. Listview getItemViewType的使用

    ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount 其中 getItemViewType返回的是有参数po ...

  8. Opencv读取图片像素值

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  9. 推荐一个好用的sql版本控制和美化工具SQLToolbelt

    SQL Toolbelt含Red Gate公司目前出品的所有SQL Server工具和新版本.也就是说,当你使用SQL Server数据库工作时,您可以很方便的获得您所需要的一套强大的工具,包括SQL ...

  10. Django常见出错解决方案汇总-乾颐堂

    一.模板类型错误: 错误原因:在models中漏掉了return: class UserProfile(models.Model): """ 功能说明:        扩 ...