J'ai lu à peu près tous les articles ici concernant les tableaux d'octets dans le framework .net et le fonctionnement du GC, mais je suis toujours à court d'idées. Tout d'abord, le code, je travaille avec:VB.Net ByteArray Memory Leak
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
Au début de la méthode, je suis en train fileBytes à Array.CreateInstance ... et puis je suis vers le bas la sauvegarde du fichier d'image. Cela signifie que je dois recharger le ByteArray à chaque fois parce que le fichier change que je regarde, donc je ne peux pas simplement réutiliser. Tout est à l'intérieur en utilisant des instructions et fileBytes DEVRAIT être détruit quand l'exécution quitte la méthode mais elle n'est JAMAIS effacée et la mémoire continue à s'incrémenter jusqu'à ce qu'une exception SystemOutOfMemoryException se produise. Si le GC ne libère pas de mémoire tant qu'il n'est pas censé être nécessaire, il ne le libère pas ici même si c'est nécessaire. Comment puis-je obtenir FileBytes pour libérer sa mémoire entre les appels à SomeFunction()?
Merci!
Avez-vous essayé de définir 'fileBytes' en dehors de la fonction (comme une variable de niveau classe?) – vbnet3d
Byte arrays dont/ne fuit pas. Il est plus likley que le fichier TIFF aimerait être éliminé. S'il a une méthode 'Dispose', utilisez-le. – Plutonix
Ok, peut-être que "leak" n'est pas le bon mot, mais c'est certainement le fichierBytes() qui ne libère pas la mémoire car je l'ai parcouru et je peux l'observer chaque fois qu'il est défini. – DonnieDarko