加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长资讯 > 动态 > 正文

Dotnet的垃圾回收

发布时间:2021-04-03 12:42:32 所属栏目:动态 来源:互联网
导读:收之前,先说说两个概念: 托管代码,是由CLR管理的代码 非托管代码,是由操作系统直接执行的代码 在早期C++的时候,内存分配和释放都是由我们手动处理的,而在公共语言进行时CLR中,多了一个垃圾收集器GC,来充当自动内存管理器,完成同样的工作。从此,对



收之前,先说说两个概念:

  • 托管代码,是由CLR管理的代码
  • 非托管代码,是由操作系统直接执行的代码

在早期C++的时候,内存分配和释放都是由我们手动处理的,而在公共语言进行时CLR中,多了一个垃圾收集器GC,来充当自动内存管理器,完成同样的工作。从此,对于开发人员来说,我们可以不需要用显式的代码来执行内存管理。这样做的好处是明显的:大量相关内存的错误被消除了,比方没有释放对象导致的内存泄露,或试图访问已经释放的对象的内存,等等。

为了防止不提供原网址的转载,特在这里加上原文链接:https://abc.com

一、回收和管理托管资源

上面说了,垃圾回收GC在Dotnet中是一个自动的内存管理器,是一种机制,用来清理和回收堆内存中未引用的部分。

通常CLR会在这些情况下启动垃圾回收:

  • 需要在堆上分配内存给一个新对象,但没有足够的空闲内存时;
  • 对象被强制Dispose时;
  • 托管堆上已分配对象的内存超过了阀值(这个阀值会动态调整);
  • 调用了GC.Collect方法

这些内容都是基础,了解了非常好,面试时有话可说。不了解也没关系,不会影响做一个好的程序出来。

下面的内容如果能记住,倒是对于程序开发很有帮助。

在Dotnet的垃圾回收机制中,回收器会自行优化并适用于多种方案。但是,我们仍然可以根据运行环境来设置垃圾回收的类型。

Dotnet的CLR提供了下面两种类型的垃圾回收:

  • 工作站垃圾回收
  • 服务器垃圾回收

这两种回收机制,有一定的区别。

工作站回收,主要是为客户端应用设计的,也是程序默认的回收机制。垃圾回收的过程,跑在触发垃圾回收的用户线程上,并使用相同的优先级。这种方式,优点是不会被挂起或延迟,缺点是需要与其它线程竞争CPU时间。当运行环境中只有一个CPU时,系统会自动采用工作站方式,不管你设置成什么。

服务器回收,针对的是高吞吐的服务器应用,回收过程跑在专用的高优先级线程上,而且默认是多线程在跑,所以效率更高,缺点是占用的资源会更多,而且由于线程之间的干扰和上下文切换,会影响整体性能。

所以,选择什么样的回收机制,需要认真分析。通常普通应用,工作站回收就好。如果是服务器端的API服务,需要选择服务器回收。而如果是在服务端需要启动多个实例进行处理,比方对总线的数据保存,那还是工作站回收好。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读