我已经开始检查项目中的一些代码,发现这样的事情:
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
这些线通常出现在被设想在提高效率的基础上破坏对象的方法上.我发表了这样的言论:
1,2和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) 可能重复:
何时可以调用GC.Collect?
据我所知,CLR为你做了所有这些垃圾收集,但是有理由手动调用GC.Collect()吗?
是否在关闭文件,处置图像资源或非托管资源时应该调用GC.Collect()以立即快速清理未使用的内存?