2016-03-28 6 views
0

私は、ここでは、.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にメモリを解放させる方法を教えてください。

ありがとうございます!

+0

関数の外で 'fileBytes'を定義しようとしましたか(クラスレベルの変数として) – vbnet3d

+0

バイト配列は、リークしません。 TIFFファイルを廃棄したいと思う方が多いです。それが 'Dispose'メソッドを持っているなら、それを使用してください。 – Plutonix

+0

「リーク」は間違った言葉かもしれませんが、メモリを解放しているfileBytes()は設定されているたびに増分することができます。 – DonnieDarko

答えて

0

バイト配列を外側から渡して処理を行い、各ラウンドで破壊される別のクラスを作成しました。どちらもうまくいかなかった。だから私はちょうど戻ってそれを見て終わった。各ページごとに配列を作成する必要はなく、注釈を個々のページに追加した後にドキュメントが保存されます。私は、各ページをループしてそのページの注釈を追加し、最後に一度だけ保存する前に配列を取得するように変更しました。本当にシンプルなのは、一歩前進して、それがすでに存在していたものを前提にするのではなく、違った見方をするだけでした。