我与vb.net下面的代码:.NET内存泄漏,使用GC.Collet()或者不
Public Async Function WriteData(buffer() As Byte, offset As Integer, count As Integer) As System.Threading.Tasks.Task
Try
Using data_writer = IO.WindowsRuntimeStreamExtensions.AsStreamForWrite(_outputStream)
Await data_writer.WriteAsync(buffer, offset, count)
Await data_writer.FlushAsync
End Using
Catch ex As Exception
Logger.Write(ex)
End Try
End Function
我调用该函数WriteDate太多,但我注意到在增加内存每次我调用函数,因为您可以看到datawriter流和_outputStream被处置,因为使用Using。
当我运行vs Profiler时,分析器显示95%的内存被我的代码中的“buffer”字节数组保留过多。
1-您是否在我的代码中看到任何问题? 2-如何清除字节数组?
- 我下面的代码添加到该函数的行等待data_writer.FlushAsync
buffer = Nothing
GC.Collect()
所以我的记忆不会像以前那样增加后,但我打电话写数据太多我的应用程序,和我请阅读,建议不要调用GC.Collect太多。
不调用GC.Collect,内存跳转到300 MB,GC.Collect()内存不超过50MB。
请指教。
谢谢
许多感谢@Hans,真是一个非常好的解决方案。 1-分裂缓冲区小于85K可能会降低性能和速度2-我如何重新使用缓冲区? – Sameh 2013-04-08 11:45:07
不,不存在由于小缓冲区I/O会明显减慢的情况。除非你使缓冲区小于一千字节。注意过早优化,特别是在手机上。一个好的缓冲区大小是4096字节。我无法帮助您弄清楚如何重用缓冲区,我看不到调用此方法的代码。 – 2013-04-08 11:59:08
非常感谢@Hans你的回答是公平的,谢谢你的时间。 – Sameh 2013-04-08 12:06:17