相关疑难解决方法(0)

使用GC.Collect()是否正确; GC.WaitForPendingFinalizers();?

我已经开始检查项目中的一些代码,发现这样的事情:

GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

这些线通常出现在被设想在提高效率的基础上破坏对象的方法上.我发表了这样的言论:

  1. 在销毁每个对象时显式调用垃圾收集会降低性能,因为如果CLR性能绝对必要,则不考虑它.
  2. 按该顺序调用这些指令会导致每个对象仅在最终确定其他对象时被销毁.因此,一个可以独立销毁的对象必须等待其他对象的破坏,而没有必要.
  3. 它可以产生死锁(参见:这个问题)

1,2和3都是真的吗?你能给出一些支持你答案的参考吗?

虽然我几乎可以肯定我的言论,但我需要明确我的论点,以便向我的团队解释为什么这是一个问题.这就是我要求确认和参考的原因.

.net c# garbage-collection

31
推荐指数
5
解决办法
3万
查看次数

即使在需要时也不会发生垃圾收集

我制作了一个64位WPF测试应用程序.随着我的应用程序运行并打开任务管理器,我会查看系统内存使用情况.我看到我使用2GB,我有6GB可用.

在我的应用程序中,我单击"添加"按钮将新的1GB字节数组添加到列表中.我看到我的系统内存使用量增加了1GB.我点击添加总共6次,填充我开始时可用的6GB内存.

我单击"删除"按钮6次,从列表中删除每个数组.删除的字节数组不应该由我的控件中的任何其他对象引用.

当我删除时,我没有看到我的记忆下降.但这对我来说没关系,因为我知道GC是非确定性的,所有这一切.我认为GC会根据需要收集.

所以现在内存看起来很满,但是期望GC在需要时收集,我再次添加.我的电脑开始滑入和跳出磁盘晃动昏迷.为什么GC不收集?如果不是时候做,那么什么时候?

作为一个完整性检查,我有一个强制GC的按钮.当我推动它时,我很快就恢复了6GB.这不能证明我的6个阵列没有被引用,并且如果GC知道/想要收集COULD吗?

我已经阅读了很多说我不应该调用GC.Collect()但是如果GC在这种情况下不收集,我还能做什么?

    private ObservableCollection<byte[]> memoryChunks = new ObservableCollection<byte[]>();
    public ObservableCollection<byte[]> MemoryChunks
    {
        get { return this.memoryChunks; }
    }

    private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        // Create a 1 gig chunk of memory and add it to the collection.
        // It should not be garbage collected as long as it's in the collection.

        try
        {
            byte[] chunk = new byte[1024*1024*1024];

            // Looks like I need to populate memory otherwise it doesn't show up in task …
Run Code Online (Sandbox Code Playgroud)

.net c# memory garbage-collection

25
推荐指数
2
解决办法
8695
查看次数

何时在.NET中使用GC.Collect()?

可能重复:
何时可以调用GC.Collect?

据我所知,CLR为你做了所有这些垃圾收集,但是有理由手动调用GC.Collect()吗?

是否在关闭文件,处置图像资源或非托管资源时应该调用GC.Collect()以立即快速清理未使用的内存?

.net c# garbage-collection

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

.net ×3

c# ×3

garbage-collection ×3

memory ×1