C# - 关于垃圾收集和托管和非托管资源的基本误解

时间:2015-11-11 04:23:14

标签: c# memory garbage-collection unmanaged managed

我一直在尝试收集有关托管与非托管资源如何在.NET中工作的信息的一点点信息。我无法找到一篇精确定义工作原理的文章,所以我一直在拼凑来自网络上的信息,可能只会产生一种误解。

我只是简单地不明白托管和非托管资源的直观性。据我所知,托管资源是由垃圾收集器管理的资源,因此它们在GC的堆中分配了一些内存。收集垃圾时,它会检查对象何时没有更多引用,并将其从内存中删除,然后在堆上执行“压缩”,以便删除死对象所在的内存空间。

另外,我知道有关于第0代,第1代和第2代的东西,并且在每次垃圾收集之后,一代中的剩余对象会被提升到下一代。因此,第0代有一个很小的堆,用于非常短暂的对象,而第1代和第2代在堆中拥有越来越多的空间,用于具有更长生命周期的对象,并且可以存活更多的垃圾收集。但是,我不知道,在或 压缩发生之后,对象的“碰撞”是否会发生在之前。

我也知道垃圾收集器在一个线程中与当前进程线程同时运行并且具有最低优先级,因此它不会经常运行。但这并没有让我对 运行的确切时间有所了解。是随机的吗?当使用如此少的资源时,GC线程可以与当前进程线程并行运行吗?

最后,当谈到非托管资源时,我完全不知道。我可以从中得出的唯一一点是它们“不是”托管资源,因此不受GC管理,因此不属于GC的堆。那么,非托管资源在哪里呢?他们去哪里?从我可以看出,似乎还有另一个“堆”(虽然我只看到模糊上下文中使用的术语)不是GC的一部分,或者其他东西。

我对内存如何在.NET程序中工作有一个非常糟糕的内部想法,所以托管和非托管资源之间的区别对我来说仍然非常模糊。另外,我是一个视觉学习者;我通过实例学习,并且我找不到太多能够帮助我理解这一点的例子。

除非我误解了这一点,否则使用new关键字创建的C#中的所有对象都是托管资源。那么如何甚至创建非托管资源呢?我多次读过文件流有非托管资源,但究竟是那些非托管资源?如何打开文件?

总而言之,我有一个非常糟糕的内部地图,内容是关于内存,垃圾收集以及C#.NET程序中托管和非托管资源的处理。 有人可以为我澄清这个问题,还是将我链接到一篇清楚解释这个问题的文章?我觉得我错过了一些我尚未发现的关键信息,这些信息将把所有内容拼凑在一起。我是吗?

编辑:我知道我问的很多,但我正在寻找的是对以下具体问题的澄清:

  1. 什么是非托管资源,以及它们如何“创建”?
  2. 非托管资源在哪里进入GC的堆中?
  3. 读者注意:如果您只是阅读上述问题,很明显我的问题是重复的。但是我从上到下扫描了许多问题和文章,以展示我上面所知的信息,并且我从根本上找不到任何我无法找到的信息。 那是这个问题真的,这就是为什么我认为这不是重复。

0 个答案:

没有答案