IT评测·应用市场-qidao123.com

标题: 基于C#了解垃圾回收机制 [打印本页]

作者: 老婆出轨    时间: 2025-1-1 06:50
标题: 基于C#了解垃圾回收机制
1. 什么是垃圾回收(Garbage Collection,简称GC)
在C#等支持自动内存管理的编程语言中,垃圾回收机制是一种自动释放不再被步伐使用的内存空间的机制。
步伐运行过程中会不停创建对象实例,这些对象占用内存空间,而当某些对象不再被需要时(比如其对应的引用变量不再指向它,且步伐后续也不会再访问到它),就需要回收它们所占用的内存,以便内存能被高效地重复使用,制止内存走漏等题目。

2. 垃圾回收的工作原理
C#的垃圾回收器基于引用计数和跟踪算法来实现内存管理。当一个对象没有任何引用指向它时,垃圾回收器就会认为这个对象是不再需要的,从而将其占用的内存回收。
C#的垃圾回收器紧张包括三个代(Generation):第0代、第1代和第2代。差异代的对象具有差异的生命周期和回收频率。第0代包罗新创建的对象,第1代包罗从第0代晋升的对象,第2代包罗从第1代晋升的对象以及长期存活的对象。
3. 垃圾回收的工作流程

4. 常见的垃圾回收算法


       
                   
                                            主流的"标记并扫除"的方式



代码示例来观察垃圾回收的结果(简单表现)
以下是一个简单的C#代码示例,通过创建一些对象并让它们的引用关系变革,来观察垃圾回收的环境(实际中很难准确控制垃圾回收器何时执行,这里只是模拟一种大概触发垃圾回收的场景)。
  1. using System;
  2. class MyClass
  3. {
  4.     ~MyClass()
  5.     {
  6.         Console.WriteLine("对象被回收了");
  7.     }
  8. }
  9. class Program
  10. {
  11.     static void Main()
  12.     {
  13.         // 创建一个对象实例
  14.               MyClass obj1 = new MyClass();
  15.         // 再创建一个对象实例
  16.               MyClass obj2 = new MyClass();
  17.         // 让obj2不再引用它原来指向的对象,模拟失去引用的情况
  18.         obj2 = null;
  19.         // 强制进行垃圾回收(虽然不能保证立刻执行,但会提示垃圾回收器可以尝试回收了)
  20.         GC.Collect();
  21.         GC.WaitForPendingFinalizers();
  22.         // 让obj1也不再引用对象,再次模拟失去引用情况
  23.         obj1 = null;
  24.         // 再次强制进行垃圾回收
  25.         GC.Collect();
  26.         GC.WaitForPendingFinalizers();
  27.         Console.ReadKey();
  28.     }
  29. }
复制代码
输出结果:
  1. 对象被回收了!
  2. 对象被回收了!
复制代码
在上述代码中:

                                                   代码思想也是泉源于生存
需要注意的是,在实际的生产代码中,一样平常很少会自动去频繁调用 GC.Collect(),由于垃圾回收器本身有自己的一套优化战略和触发机制来决定何时进行垃圾回收最合适,过分手动干预大概反而会影响步伐的性能和正常运行逻辑。
别的,差异版本的.NET框架以及运行时环境下的垃圾回收机制在细节和实现上大概会有肯定差异,本文只是先容了根本的通用原理和简单的示例演示。




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4