【发布时间】:2016-03-28 19:27:03
【问题描述】:
我已经阅读了几乎所有关于 .net 框架中的字节数组以及 GC 工作原理的帖子,但我仍然不知所措。首先,我正在使用的代码:
Public Sub SomeFunction(ByVal page As Integer, ByVal xml As String)
Dim fileBytes As Byte()
Using imageStream As New IO.FileStream(_imageFile, IO.FileMode.Open)
fileBytes = Array.CreateInstance(GetType(Byte), imageStream.Length)
imageStream.Read(fileBytes, 0, imageStream.Length)
imageStream.Close()
End Using
Using ms As New IO.MemoryStream(fileBytes)
Dim tiff As New Atalasoft.Imaging.Codec.Tiff.TiffFile
tiff.Read(ms)
Dim tag = tiff.Images(page - 1).Tags.LookupTag(58000)
If tag IsNot Nothing Then
tiff.Images(page - 1).Tags.Remove(tag)
End If
tag = New Atalasoft.Imaging.Metadata.TiffTag(58000, System.Text.Encoding.ASCII.GetBytes(xml))
tiff.Images(page - 1).Tags.Add(tag)
tiff.Save(_imageFile)
End Using
End Sub
在方法开始时,我将 fileBytes 设置为 Array.CreateInstance...,然后在底部保存图像文件。这意味着我每次都必须重新加载 ByteArray,因为我正在查看的文件正在更改,所以我不能只是重复使用。一切都在 using 语句中,并且当执行离开方法时应该销毁 fileBytes,但它永远不会被清除,并且内存不断增加,直到发生 SystemOutOfMemoryException。如果 GC 直到据称需要它才释放内存,那么即使需要它,它也不会在这里释放它。如何让 fileBytes 在调用 SomeFunction() 之间释放其内存?
谢谢!
【问题讨论】:
-
您是否尝试过在函数外部定义
fileBytes(作为类级变量?) -
字节数组不会/不能泄漏。 TIFF 文件更可能被处理。如果它有
Dispose方法,请使用它。 -
好的,也许“泄漏”是错误的词,但绝对是 fileBytes() 没有释放内存,因为我已经逐步完成了它并且可以看到它每次设置时都会增加,然后它永远不会释放。
-
TIFF 文件没有 dispose 方法。而这并不是保留记忆的东西。我特意询问如何从字节数组中释放内存。谢谢。
-
vbnet3d,是的,我已经尝试过了(这就是最初的做法),但我得到了完全相同的结果。
标签: vb.net memory-leaks garbage-collection