2012-01-06 49 views
0

我已经制作了一个简单的.net应用程序,它从数据库获取数据并保存为excel文档。我注意到的问题是,一旦过程完成并生成电子表格,应用程序就会消耗约750MB的内存。它正在整理一个大的报告,但是我认为一旦它保存了内存就被释放了?.Net c#应用程序在完成过程后使用太多内存

这是这种情况?

谢谢

+0

你从哪里得到'750 MB的内存'?您可能正在查看“Working Set”,因为即使它们未被使用,页面仍保留在进程的工作集中,这将是一个不好的指标。确保你正在查看私人字节 – 2012-01-06 15:25:30

回答

2

在.Net内存不一定会自动释放。

您可以尝试使用Dispose()实现IDisposable的所有大对象和/或清空对这些实例的任何引用,然后调用GC.Collect()来强制立即进行垃圾回收。 可能会在您完成对大对象的引用时提供帮助

+1

如果你打算把它投下来,请提供一个关于答案有什么问题的评论。就我而言,这个答案更适合对原始问题发表评论。 – RQDQ 2012-01-06 15:25:51

+0

我几乎立即得到2个downvotes。我真的很感谢downvoters至少留下了一个评论,说明我在错误的方向前进。 – 2012-01-06 15:29:57

+0

@DennisTraub它更适合作为评论,因为你提出的问题并没有提供直接的答案。 – msarchet 2012-01-06 15:30:37

2

内存不会立即由Garabage Collector释放。

另外你是否确保你正确处理所有的对象,并允许垃圾收集器拿起物品。在你保存后的想法中,如果该项目仍被应用程序中的某些内容引用,则无关紧要。

+1

特别是Excel资源,因为这些可能会占用大量内存并可能是原因 – w69rdy 2012-01-06 15:25:53

+0

这是真的。我有一个后台工作人员正在运行以生成excel文档。垃圾收集器将运行以释放不再由应用程序使用的任何内存? GC.Collect()(来自下面的帖子) – MrPink 2012-01-06 15:38:43

1

如果数据仍然被引用和应用程序使用,那么内存不会被垃圾收集。见garbage collection

另请参阅this previous question可能有帮助吗?我发现它非常有用,特别是Igor Zevaka的回答。

0

检查定义。例如,如果你在你的代码中定义了表单,它会使用很多内存,因为很多时候都是以相同的形式开始的。

例如;我的应用程序中有3种形式。 Form1,Form2和Form3。

namespace RAMAPP 
{ 
    public partial class RAMAPP : Form 
    { 
     Form1 first = new Form1(); 
     Form2 second = new Form2(); 
     Form3 third = new Form3(); 

    public RAMAPP() 
    { 
     InitializeComponent(); 
    } 
} 
} 

在这里,当您点击开始按钮时,程序将读取您现在写入的所有行。在开始之前,将RAMAPP程序定义为第一,第二和第三。问题是在初始化之前定义这些表单。 您应该在初始化之前删除所有表单定义。 在此之后,重新启动您的程序,它将有望运行:)

相关问题