在本章中,我们将介绍垃圾收集的概念,垃圾收集是.NET托管代码平台最重要的特性之一。 垃圾收集器(GC)管理内存的分配和释放。 垃圾收集器用作自动内存管理器。

  • 我们不需要知道如何分配和释放内存或管理使用该内存的对象的生命周期
  • 每当使用new关键字声明对象或将值类型装箱时,都会进行分配。分配通常非常快。
  • 当没有足够的内存分配一个对象时,GC必须收集和处理垃圾内存以使内存可用于新的分配。

这个过程被称为垃圾收集。

垃圾收集的优势

垃圾收集提供以下好处(优势) -

  • 在开发应用程序时,不需要手动释放内存。
  • 它还有效地在托管堆上分配对象。
  • 当对象不再使用时,它将通过清除内存来回收这些对象,并将内存保留为将来的分配。
  • 托管对象自动获得干净的内容,所以它们的构造函数不必初始化每个数据字段。
  • 它还通过确保对象不能使用其他对象的内容来提供内存安全性。

垃圾收集的条件

垃圾收集在下列条件之一时发生:

  • 当系统的物理内存较低时。
  • 托管堆上分配的对象使用的内存超过了可接受的阈值。该阈值在流程运行时不断调整。
  • GC.Collect方法被调用,在几乎所有情况下,不必调用此方法,因为垃圾收集器连续运行。这种方法主要用于独特的情况和测试。

阶段过程

.NET垃圾收集器有3代,每一代都有自己的堆,用于存储分配的对象。有一个基本的原则,判定大多数对象是短暂的还是长期的。

1. 第一代(0)

  • 在第0代中,首先分配对象。
  • 在这一代,对象通常不会超越第一代,因为在下一次垃圾收集时,它们不再被使用(超出范围)。
  • 0代很快收集,因为它相关的堆很小。

2. 第二代(1)

  • 在第一代,对象有第二个机会空间。
  • 在第0代收集(通常是基于巧合的时机)下寿命很短的对象会转到第1代。
  • 第一代集合也很快,因为它的关联堆也很小。
  • 前两堆仍然很小,因为对象被收集或提升到下一代堆。

3. 第三代(2)

  • 在第二代,所有的长对象都是活动的,它的堆可以长得很大。
  • 这一代的对象可以长期存活下去,没有下一代堆积对象可以进一步推广。
  • 垃圾收集器有一个额外的堆,用于称为大对象堆(LOH)的大型对象。
  • 它保留85,000字节或更大的对象。
  • 大对象并没有分配到代代堆,而是直接分配给了LOH
  • 第二代和LOH收集可能会花费很长时间运行的程序或运行大量数据的程序。
  • 已知大型服务器程序在十几个GB中堆积如山。
  • GC采用各种技术来减少阻止程序执行的时间。
  • 主要方法是在后台线程上尽可能多地执行垃圾回收工作,而不会干扰程序执行。
  • GC还为开发人员提供了一些方法来影响其行为,这对提高性能非常有用。

来源:BootWiki
链接:https://www.bootwiki/netcore/dotnet_core_garbage_collection.html
著作权归作者所有
商业转载请联系作者获得授权,非商业转载请注明出处

.NET Core垃圾收集的更多相关文章

  1. ASP.NET Core 性能优化最佳实践

    本文提供了 ASP.NET Core 的性能最佳实践指南. 译文原文地址:https://docs.microsoft.com/en-us/aspnet/core/performance/perfor ...

  2. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  3. 微软开源.NET Core的执行引擎CoreCLR{转载}

    继去年12月宣布.NET Core开源之后,微软拥抱开源的决心又向前迈了一步,Microsoft于昨日在 .NET Framework Blog上 宣布开源.NET Core 的执行引擎 CoreCL ...

  4. ASP.NET Core 四种释放 IDisposable 对象的方法

    本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...

  5. 是什么优化让 .NET Core 性能飙升?

    .NET Core(开放源代码,跨平台,x-copy可部署等)有许多令人兴奋的方面,其中最值得称赞的就是其性能了. 感谢所有社区开发人员对.NET Core做出的贡献,其中的许多改进也将在接下来的几个 ...

  6. 讨论.NET Core 配置对GC 工作模式与内存的影响

    引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg 这篇文章中 ...

  7. 给外行或者刚入门普及一下关于C#,.NET Framework(.NET框架),.Net,CLR,ASP,ASP.Net, VS,以及.NET Core的概念

    一.概念 1. C# :C#是微软公司发布的一种面向对象的.运行于.NET Framework之上的高级程序设计语言. 2..NET Framework(.NET框架):.NET framework ...

  8. 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

    什么是.NET?什么是.NET Framework?本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包 ...

  9. 【转载】通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

    本文转载自:http://www.cnblogs.com/1996V/p/9037603.html [尊重作者原创,转载说明出处!感谢作者“小曾看世界”分享! ] 什么是.NET?什么是.NET Fr ...

随机推荐

  1. Docker实现退出container后保持继续运行的解决办法

    现象: 运行一个image,例如ubuntu14.04: 1 docker run -it --rm ubuntu:14.04 bash 退出时: 执行Ctrl+D或者执行exit 查看线程: 1 d ...

  2. HMAC简介及HMAC-SHA256实现Demo

    一.什么是HMAC HMAC是一种使用单向散列函数来构造消息认证码的方法,其中HMAC中的H就是Hash的意思. HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HM ...

  3. python使用笔记26--多线程、多进程

    1.概念 线程.进程 进程是资源的集合,也就是一个程序 线程是一个程序运行的最小单位 线程是在进程里面的 默认,一个进程就只有一个线程 一个电脑有几核CPU就只能同时运行几个任务,比如4核CPU只能同 ...

  4. spring-4-申明事务

    categories: spring5 事务回顾 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一 ...

  5. Lesson2 Thirteen equals one

    ​ Lesson2 Thirteen equals one equal ['i:kwəl] v. 等于 He equaled the world record. Nobody equals him i ...

  6. 在windows中安装PHP MongoDB扩展

    最近做的一个项目中涉及到,ThinkPHP框架,MongoDB数据库,在本地windows 7 64位系统下,xamppv3.2.2集成的php环境运行测试程序.在网上百度后,按说明配置成功,现将步骤 ...

  7. 每天五分钟Go - 指针

    什么是指针 一个指向内存地址的变量,称为指针变量,指针是一个特殊的变量,他的值存储的是另一个值的内存地址 指针变量的声明 var var_name *type var_name 是指针变量的名称,ty ...

  8. ELK:match 的底层转换

    在ES中,执行match搜索的时候,ES底层通常都会对搜索条件进行底层转换,来实现最终的搜索结果.如: GET /student/java/_search { "query": { ...

  9. Odoo开发规范

    本文来源:https://www.jianshu.com/p/e892bf01f036 Odoo开发规范 模块结构 文件夹列表及对应作用 data/:演示和数据文件 models/:模型定义 cont ...

  10. java命名规则/规范

    Java命名规则: 名称只能由字母.数字.下划线.$符号组成. 不能以数字开头,不能包含空格. 名称不能使用Java中的关键字. Java命名规范: 项目名全部小写:     project 包名全部 ...