加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#MemoryStream泄漏内存后,处理/关闭/ etc?

发布时间:2020-12-16 10:30:57 所属栏目:百科 来源:网络整理
导读:我一直在跟踪我的应用程序中的大量内存偷看,似乎问题是MemoryStream类.每当我使用一个,使用’using’关键字或显式关闭/ dispose时,垃圾收集器永远不会收集内存.这有什么不对? byte[] bData = System.IO.File.ReadAllBytes( "F:application_exit_bw.png" )
我一直在跟踪我的应用程序中的大量内存偷看,似乎问题是MemoryStream类.每当我使用一个,使用’using’关键字或显式关闭/ dispose时,垃圾收集器永远不会收集内存.这有什么不对?

byte[] bData = System.IO.File.ReadAllBytes( "F:application_exit_bw.png" );
using( System.IO.MemoryStream hMemoryStreamOutput = new System.IO.MemoryStream())
{
    for ( int i = 0; i < 10000; i++ ) hMemoryStreamOutput.Write( bData,bData.Length );
}
Thread.Sleep(Timeout.Infinite);

通过显式关闭/ dipose,行为保持不变.内存被占用并将保持这种状态,直到我关闭我的应用程序,或者,应用程序填满了所有系统内存.救命?

解决方法

问题的另一方面是您用来确定“内存泄漏”的内容.有许多不同的方法来衡量“免费”记忆,依赖于它你可能得到完全不同的结果.

>内存使用情况显示在任务管理器中 – 由于GC使用内存的方式,即使CLR GC认为所有内存都“空闲”,也不会发生故障.
> GC内存性能计数器(和属性) – 这些实际上将显示GC对内存的看法.您希望使用它们来检测托管内存泄漏.

MemoryStream(以及任何其他大型86K)分配还有一件事 – 它们使用仅在完整GC上收集的大对象堆,触发它可能需要运行GC.Collect两次.在应用程序的正常流程中,它将足够重复,因此您可能无法在应用程序关闭之前释放此内存.诊断 – 检查GC收集性能计数器(GC的数量).

还有一个:如果你正在尝试解决内存泄漏问题,因为你遇到“内存不足”异常,可能是由地址空间碎片引起的(通常只有32位进程).如果是这种情况 – 考虑创建自己的内存流,不在单个块中分配内存,然后在增长流时必须复制它.或者至少尝试预先分配流中的空间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读