‫我们会回来的｡
‫在本视频中, 我想谈谈垃圾收集器以及C-sharp如何处理内存｡
‫因此, 垃圾收集是一种在多种编程语言中都可用的工具｡
‫有些是手动完成的, 有些是自动完成的｡
‫而且.NET framework提供了自动内存管理,
‫这意味着你不必像在所有编程语言中那样手动使用垃圾收集器｡
‫所以像C或C++等编程语言, 它们有一个手动垃圾收集, 你必须时不时地运行它,
‫你必须知道什么时候必须运行它｡
‫所以这是在C商店中自动完成的｡
‫这就是为什么它不是很多人经常使用的东西｡
‫所以一旦你有了更复杂的程序和真正先进的, 那么你就会开始时不时地使用它｡
‫但实际上, 它并不是你必须一直使用的东西, 甚至在大多数情况下根本就不必使用｡
‫所以这就是为什么它不是一个主要的话题, 可以这么说｡
‫好吧, 我会的
‫假设我们有一个叫丹尼斯的对象, 它的类型是人类｡
‫所以我创建了一个类, 叫做human, 有很多不同的属性等等｡
‫最后, 我创建了一个人类类型的对象, 它叫丹尼斯｡
‫通过这样做, 通过使用这个新的关键字, 我需要内存, 因为它在我的内存中创建了一个对象｡
‫因此, C Sharp为我们分配内存, 一旦对象不再被使用,
‫框架就会负责回收内存供系统使用｡
‫所以在这个例子中, 我创建了这个对象, 然后我可能会使用它, 我可能会一次又一次地使用它｡
‫但有一次, 我不再使用它了, 我甚至可能会删除对它的引用｡
‫然后, 是的, 垃圾收集器会清理它, 因为这个内存现在被阻塞了,
‫垃圾收集器必须清理｡
‫因此, 它必须使这个内存再次可用于其他对象, 例如｡
‫现在让我们从视觉的角度来看｡
‫所以我们在左手边有这个系统内存池, 在右手边有我们的程序｡
‫而系统内存池有一堆内存, 所以我们可以将这些内存用于多个不同的程序｡
‫但现在我们有了运行它的程序, 现在在程序中我们创建了一个对象｡
‫现在, 我们突然需要一点记忆空间｡
‫好吧, 我会的
‫所以我们的程序引用了存储对象的内存｡
‫好吧, 我会的
‫所以有一个直接引用, 我们可以重用它, 我们可以从不同的位置调用它, 等等｡
‫好吧, 我会的
‫然后我们又有了一个又一个｡
‫所以我们创建了多个不同的对象｡
‫每次我们创建一个新对象时, 内存池中都会分配一个内存, 并且我们的程序会引用该内存｡
‫所以这些参考资料都在那里｡
‫所以有一个从我们的程序到内存池的引用｡
‫现在, 在某个点上, 引用可能会被删除｡
‫所以我们可以通过设置一个变量为空或者对象为空来删除引用, 然后引用突然消失了｡
‫现在我们的程序不再引用这个小内存分配了｡
‫垃圾收集器注意到了, 然后说, 好吧,
‫没有引用, 所以这一小块内存从未被使用过, 所以让我们清理它, 或者让我们重新分配它, 或者让我们释放它, 以供其他分配｡
‫这就是发生的事情｡
‫现在让我们看一个垃圾收集器何时启动的例子｡
‫这里有一个函数, 叫做my function, 我在这里创建一个对象.
‫再说一遍, 它叫丹尼斯｡
‫然后丹尼斯就叫他的方法, 或者我们叫他的方法比如教｡
‫然后我们设定他的年龄, 然后我们调用另一种方法, 变老等等｡
‫但是在某个点上, 内存中的这个Dennis对象不再需要了, 因为函数调用已经结束｡
‫所以函数结束对象｡
‫Dennis超出了作用域, 不再有对Dennis的引用, 因为我的函数是一个函数, 我们有一个对象,
‫它在一个函数内, 所以它的作用域在函数内.
‫所以一旦函数调用结束, 就不再有对它的直接引用了,
‫因为我们不能从函数外部引用函数内部的对象｡
‫好吧, 我知道了
‫所以我们需要为此创建字段或使用其他方法｡
‫但最后, 垃圾收集器, 清理这个丹尼斯, 并重新分配这个内存｡
‫这里的基本思想是这只是一个简单的例子｡
‫还有很多其他情况下垃圾收集器会启动, 但这是我们已经使用过的东西｡
‫你们在这里看到的概念, 我们已经在本课程的其他视频或讲座中看到过了｡
‫这就是我选择这个例子的原因｡
‫那么, 关于垃圾收集, 您需要了解哪些信息？
‫您不必手动调用垃圾收集器, 但可以, 因此您可以手动执行此操作｡
‫垃圾收集器需要处理能力, 因此它位于单独的线程上, 并且非常轻量级｡
‫但是仍然需要一些处理能力｡
‫垃圾收集器的目标是释放内存, 但不使用太多的处理能力｡
‫因此, 它通常不需要太多的处理能力, 但它不会一直被调用,
‫或者垃圾收集器不会一直运行以释放内存｡
‫它只会在必要的时候运行, 或者在它认为必要的时候, 在它认为必要的时候｡
‫所以这才是真正棘手的地方｡
‫内存不一定会立即回收｡
‫垃圾收集器可能需要一点时间, 即使您手动调用它, 它也不必立即运行｡
‫这些是关于垃圾收集器的一些棘手的事情｡
‫您可以实作已完成的方法, 以便在内存回收行程即将从内存释放物件之前执行程式码｡
‫这意味着, 如果您决定在清理对象之前运行特定代码, 那么就在垃圾回收器清理对象之前｡
‫例如, 一旦不再有对它的引用, 那么你就可以使用这个类中的final
‫laser方法来实现你希望它们运行的特定功能｡
‫也许你想在垃圾收集器进来清理你的对象之前自己清理东西, 或者重新定位内存,
‫或者把它从内存释放给这个对象｡
‫好吧, 我会的
‫垃圾收集器何时运行？
‫当系统的物理内存不足时,
‫当分配的内存超过预设阈值时, 当垃圾收集器collect或collect方法被调用时, 即使这是一个非常棘手的方法｡
‫所以这是一件很重要的事情｡
‫是的, 非常具体, 非常特别｡
‫如果您想了解更多有关它的信息, 您应该查看有关垃圾收集器的文档｡
‫但是dotcollect方法并不总是被直接调用, 它也不会直接清理所有内容｡
‫这更像是你在给这个工具一个建议, 所以你说, 好吧, 垃圾收集器｡
‫我个人认为这将是一个很好的观点或一个很好的地方收集垃圾, 但在某些情况下,
‫它可能不会接受它或它可能只是这样做以后或类似的东西｡
‫也许它只是做了垃圾收集, 它认为这是没有必要的, 或者类似的事情｡
‫所以这是一个非常棘手的问题｡
‫如果您想了解更多信息, 请查看文档｡
‫但我认为这是了解垃圾收集器做什么的一个很好的起点｡
‫就像我说的, 在大多数情况下, 你不需要它, 因为现在我们有这么多的记忆｡
‫如果你的程序中没有巨大的内存泄漏, 你就永远不会遇到这些问题｡