Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么多次调用GC.Collect()可以释放一些通常不可用的内存';你没打扫吗?_C#_Memory - Fatal编程技术网

C# 为什么多次调用GC.Collect()可以释放一些通常不可用的内存';你没打扫吗?

C# 为什么多次调用GC.Collect()可以释放一些通常不可用的内存';你没打扫吗?,c#,memory,C#,Memory,我在GC中发现了一件奇怪的事情,当我的应用程序删除了对许多大型对象的引用时,它仍然消耗了大量的ram,在我的例子中大约是300mb。即使调用GC.Collect() 然后我尝试在几秒钟内随机调用它10次,结果是:释放了200mb的ram,导致我的应用程序只消耗了100mb而不是300mb的私有ram(不是虚拟的,而是物理/驻留ram) 为什么会这样?如何让GC自动清理此内存而不必手动调用它?或者: 您仍然保留着对某个大对象的引用,因此即使调用GC.Collect也无法清理它 非托管内存占所消耗内

我在GC中发现了一件奇怪的事情,当我的应用程序删除了对许多大型对象的引用时,它仍然消耗了大量的ram,在我的例子中大约是300mb。即使调用
GC.Collect()

然后我尝试在几秒钟内随机调用它10次,结果是:释放了200mb的ram,导致我的应用程序只消耗了100mb而不是300mb的私有ram(不是虚拟的,而是物理/驻留ram)

为什么会这样?如何让GC自动清理此内存而不必手动调用它?

或者:

  • 您仍然保留着对某个大对象的引用,因此即使调用
    GC.Collect
    也无法清理它

  • 非托管内存占所消耗内存的大部分。您没有正确处理该非托管资源

  • 要么:

  • 您仍然保留着对某个大对象的引用,因此即使调用
    GC.Collect
    也无法清理它

  • 非托管内存占所消耗内存的大部分。您没有正确处理该非托管资源


  • 每当需要更多内存时,垃圾收集器将收集任何未使用的对象。对象只有在没有引用时才未使用。使用内存探查器查看哪些对象正在消耗您的内存,以及为什么不收集这些对象


    除此之外,您永远不需要调用
    GC.Collect
    。垃圾收集器的功能非常强大,并且经过优化,可以选择何时执行。

    只要需要更多内存,垃圾收集器就会收集任何未使用的对象。对象只有在没有引用时才未使用。使用内存探查器查看哪些对象正在消耗您的内存,以及为什么不收集这些对象


    除此之外,您永远不需要调用
    GC.Collect
    。垃圾收集器的功能非常强大,并且经过优化,可以选择何时执行垃圾收集器。

    今天有很多GC问题


    也许过了这么长时间,它会把它清理干净。如果您的程序内存不足并且没有额外调用就死掉了,请将它保留在内存中,否则它可能是不必要的。

    今天有很多GC问题


    也许过了这么长时间,它会把它清理干净。如果程序内存不足,没有额外的调用就死了,请留下它,否则可能是多余的。< / P >是的,这很可能是2个,因为我使用的是第三个C++库,这可能导致内存中的延迟。或者我不知道,但在我看来,实际上多次调用GC.Collect导致了这种情况。这很奇怪也许有可能某个没有引用的对象,包含了对另一个对象的引用,对于一个链中的10个其他对象也是如此。。因此,在每次运行GC.Collect时,其中一个被删除,另一个引用被清除?@Petr这可能是因为集合正在导致终结器运行,这最终将导致非托管内存被释放。如果您等待集合发生一次,然后等待终结器队列运行更长的时间,您会看到同样的情况。“正确的”解决方案是手动处理
    IDisposable
    对象,而不是将其留给终结器。@请参见第二条注释,否。如果有一个相互引用的对象的完整图形,但没有一个对象被根对象引用,则它们都将被清除。调用多个集合对您没有任何帮助;它正在呼叫一个,然后只是等待一段时间。在那个时候你做的事情是不相关的。是的,这很可能是2,因为我使用了第三个C++库,这可能导致内存中的延迟。或者我不知道,但在我看来,实际上多次调用GC.Collect导致了这种情况。这很奇怪也许有可能某个没有引用的对象,包含了对另一个对象的引用,对于一个链中的10个其他对象也是如此。。因此,在每次运行GC.Collect时,其中一个被删除,另一个引用被清除?@Petr这可能是因为集合正在导致终结器运行,这最终将导致非托管内存被释放。如果您等待集合发生一次,然后等待终结器队列运行更长的时间,您会看到同样的情况。“正确的”解决方案是手动处理
    IDisposable
    对象,而不是将其留给终结器。@请参见第二条注释,否。如果有一个相互引用的对象的完整图形,但没有一个对象被根对象引用,则它们都将被清除。调用多个集合对您没有任何帮助;它正在呼叫一个,然后只是等待一段时间。你在那段时间里做了什么无关紧要。你的物体有多大?超过85000字节?如果是这样的话,它们将进入大型对象堆。GC与其他内存有关LOH的规则不同。如果它们在LOH上,您可能正在查看内存碎片。您可以使用sos.dll查看内存中哪些对象处于活动状态,以及哪些对象包含对它们的引用。这可能有助于缩小导致您观察的范围。我不能使用sos,因为我有免费版本的Visual Studio,但是我的对象通常不太大,大多数对象,有些对象可能有多大?超过85000字节?如果是这样的话,它们将进入大型对象堆。GC与其他内存有关LOH的规则不同。如果它们在LOH上,您可能正在查看内存碎片。您可以使用sos.dll查看内存中哪些对象处于活动状态,以及哪些对象包含对它们的引用。那可能有帮助