私は、ここでは、.netフレームワークのバイト配列とGCの仕組みに関してほとんどすべての記事を読んでいますが、私はまだ失われています。まず第一に、私が働いているコード:メソッドの開始時にVB.Net ByteArrayメモリリーク
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
は、私が... Array.CreateInstanceするfileBytesを設定して、底部に向かって、私がイメージファイルを保存していています。これは、私が見ているファイルが変更されているので、毎回ByteArrayをリロードしなければならないことを意味しているので、再利用することはできません。すべてがステートメントを使用して内部にあり、実行がメソッドを離れるときに破棄されるべきですが、FileBytesは、決してクリアされず、SystemOutOfMemoryExceptionが発生するまでメモリはインクリメントし続けます。 GCが必要とされるまでメモリを解放しない場合、必要であってもここで解放しないでください。 SomeFunction()の呼び出しの間にfileBytesにメモリを解放させる方法を教えてください。
ありがとうございます!
関数の外で 'fileBytes'を定義しようとしましたか(クラスレベルの変数として) – vbnet3d
バイト配列は、リークしません。 TIFFファイルを廃棄したいと思う方が多いです。それが 'Dispose'メソッドを持っているなら、それを使用してください。 – Plutonix
「リーク」は間違った言葉かもしれませんが、メモリを解放しているfileBytes()は設定されているたびに増分することができます。 – DonnieDarko