freeCodeCamp/guide/chinese/csharp/garbage-collection/index.md

3.0 KiB
Raw Blame History

title localeTitle
Garbage Collection 垃圾收集

垃圾收集

什么是垃圾收集?

垃圾收集是程序试图释放对象等不再使用的内存空间的过程。垃圾收集对每种语言的实现都不同。大多数高级编程语言都内置了某种垃圾收集。低级编程语言可以通过库添加垃圾收集。

如上所述每种编程语言都有自己的GC方式。在C编程中开发人员需要使用malloc()dealloc()函数来处理内存分配和释放。对于C应用程序开发人员不再需要处理GC也不建议使用它因为.NET框架已经处理了这个问题。

####内存分配如何发生? 在C对象的内存分配发生在托管堆中这由CLR公共语言运行时处理。堆中的内存分配是通过操作系统OS中的win32.dll完成的就像在C中一样。但是在C中对象被放置在内存中而自由空间适合对象的大小。内存映射基于Linkedlist概念。在C堆的内存分配以线性方式发生即一个接一个地发生。

无论何时创建新对象,都会在堆中分配内存,并且指针将移动到下一个内存地址。 C中的内存分配比C更快。在C中内存需要为对象进行搜索和分配这会增加一些开销时间。

#### CGC中的生成 在.net编程中堆有三代分别叫做Generation 0,1,2。

无论何时创建新对象第0代都会被填充。当第0代被填满时垃圾收集器运行。新创建的对象放在第0代中。执行垃圾收集时所有不需要的对象都被销毁内存被释放并压缩。一旦GC发生GC就会指向释放内存的指针。

世代1和2具有寿命更长的对象。第1代和第2代的GC将不会发生直到第0代有足够的内存来分配。

不建议以编程方式调用GC。让它自己发生是件好事。只要第0代被填充就执行GC。 GC不会影响应用程序的性能。

垃圾收集是程序试图释放变量,对象等不再使用的内存空间的过程。垃圾收集对每种语言的实现都不同。大多数高级编程语言都内置了某种垃圾收集。低级编程语言可能会通过库添加垃圾收集。

垃圾收集是一种为程序员节省时间的工具例如它取代了对C语言中的malloc和free等函数的需求。它还可以帮助防止内存泄漏。

垃圾收集的缺点是它对性能有负面影响。程序必须定期运行程序,检查对象引用和清理内存 - 这会占用资源并且通常需要程序暂停。

如果对象没有引用不再可访问则它有资格进行垃圾回收。例如在下面的Java代码中最初由'thing1'引用的Thing对象将其唯一的引用重定向到堆上的另一个对象 - 然后它将无法访问,并且其内存将由垃圾收集器取消分配。

更多信息:

- + - https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals - 了解有关垃圾收集的更多信息