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