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

C#MemoryStream泄漏内存后,处理关闭 etc?,第1张

概述我一直在跟踪我的应用程序中的大量内存偷看,似乎问题是MemoryStream类.每当我使用一个,使用’using’关键字或显式关闭/ dispose时,垃圾收集器永远不会收集内存.这有什么不对? byte[] bData = System.IO.File.ReadAllBytes( "F:\\application_exit_bw.png" );using( System.IO.MemorySt 我一直在跟踪我的应用程序中的大量内存偷看,似乎问题是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位进程).如果是这种情况 – 考虑创建自己的内存流,不在单个块中分配内存,然后在增长流时必须复制它.或者至少尝试预先分配流中的空间.

总结

以上是内存溢出为你收集整理的C#MemoryStream泄漏内存后,处理/关闭/ etc?全部内容,希望文章能够帮你解决C#MemoryStream泄漏内存后,处理/关闭/ etc?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1220769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存