异常和内存泄漏

时间:2010-09-25 05:51:38

标签: c# exception memory-leaks

这是一个理论上的问题。在C#和.NET的情况下,如果.aspx或.ascx脚本由于未处理的异常而死亡,您通常会期望它的内存被释放,还是不确定?换句话说,未处理的异常本身是否会泄漏内存?

3 个答案:

答案 0 :(得分:2)

什么是“内存泄漏”?在手动管理的环境中,我们说未引用的分配是泄漏。根据这个定义,GC环境中没有泄漏。

但是,有一些场景具有相同的效果:

过时参考资料

// create temporary item
Item item = new Item();

// add it to the global map, so Processor::Fetch finds it by ID
itemMap.Add(item.id, item);
Process(item.id);

// remove from cache
itemMap.Remove(item.id);

如果抛出Process(),则该项目仍在itemMap中引用。除非你经常抛弃整个地图(或者你明智地决定使用弱指针作为地图),否则项目地图将累积并保留对临时数据的引用,阻止内存。

非托管资源

想象一下,您有一个小的托管对象,它分配大量的非托管资源,并且没有实现IDisposable,或者没有使用IDisposable。

这些对象可能活得足够长,无法推送到Gen 2.如果托管堆上没有其他压力,则Gen 2集合可能永远不会运行。你可能最终将微小物体推入Gen 2,直到非托管资源耗尽你的记忆。

这种情况可能听起来很愚蠢,但这正是COM Interop的工作方式(我有一个案例ID来证明它)。

答案 1 :(得分:0)

它不是所谓的,我从来没有见过它;但是垃圾收集器可能需要花费很长时间来清理,有时候直到你“使用”相当大一部分可用内存。

答案 2 :(得分:0)

通常情况下,如果您使用的只是.NET,那么只有当您需要处理非托管资源时才会泄漏内存。

为此,某些c#对象具有“release”或“dispose”功能。