找回密码
 立即注册

QQ登录

只需一步,快速开始

imp1212

初级会员

7

主题

59

帖子

473

积分

初级会员

积分
473

活字格认证

imp1212
初级会员   /  发表于:2016-7-4 10:45  /   查看:8605  /  回复:15
有个关于内存释放的问题。
DoReadBarcodes方法,在多次调用后,占用的系统内存会随着调用次数不断增加而增加,并且结束调用后不会自动释放相关内存。
请问是否有相关的释放内存的函数或解决方案?

补充说明:
当调用DoReadBarcodes方法30次的话,内存占用增加200m左右;120次左右的话,内存占用增加500m。

15 个回复

倒序浏览
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-7-4 17:43:45
沙发
Hello,问题收到,我这里查一下给你回复
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-7-4 17:47:24
板凳
AvoCaDolol 发表于 2016-7-4 17:43
Hello,问题收到,我这里查一下给你回复

我查了一下,ReadBarcode方法并不会有内存泄露的问题。
是否是RasterImage没有释放导致内存增加?
能否将你的代码上传我看看。
回复 使用道具 举报
imp1212
初级会员   /  发表于:2016-7-6 10:33:53
地板
经我方多次测试,锁定为该方法导致的内存增加:
TmpBarcode = tw.DoReadBarcodes(PicPath, Me)
该方法调用了你们的DoReadBarcodes函数。我们对这个函数进行了一定变更,但相关的dispose并没有动,改动后如下:
  Public Function DoReadBarcodes(ByVal filePath As String, ByVal owner As IWin32Window) As String
            Dim returnBarcode As String = ""
            Dim returnBarcodeFace As String = "" '面卡拼接的字符串
            'stream = System.IO.File.Open("E:\LeadTools\a.txt", FileMode.Append)
            'Dim documentFileNames As String() = New String() {Path.Combine("C:\Users\Public\Documents\LEADTOOLS Images\", "Barcode1.tif")}
            'Dim documentFileNames As String() = New String() {filePath}
            'Dim documentFileName As String = filePath
            Dim documentFileName As String = System.IO.Path.GetDirectoryName(filePath) & "\" & System.IO.Path.GetFileNameWithoutExtension(filePath) & "-tmp.tif"

            Dim barcodes As BarcodeData()

            Dim starttime As Date = Now()
            Dim endtime As Date

            Dim pageImage As RasterImage = Nothing
            Dim _barcodeEngine As BarcodeEngine = New BarcodeEngine()
            Dim _rasterCodecs As RasterCodecs = New RasterCodecs()

            Dim command As AutoBinarizeCommand = New AutoBinarizeCommand()
            pageImage = _rasterCodecs.Load(filePath)
            command.Run(pageImage)
            _rasterCodecs.Save(pageImage, filePath, Leadtools.RasterImageFormat.Tif, 1, pageImage.Page, pageImage.PageCount, 1, Leadtools.Codecs.CodecsSavePageMode.Overwrite)
            pageImage.Dispose()

            If Me.getGrayImage(filePath, documentFileName) Then
                ''Dim image As RasterImage = Nothing
                'Dim pageImage As RasterImage = Nothing
                'Dim _barcodeEngine As BarcodeEngine = New BarcodeEngine()
                'Dim _rasterCodecs As RasterCodecs = New RasterCodecs()
                ''For Each documentFileName As String In documentFileNames
                'Dim command As AutoBinarizeCommand = New AutoBinarizeCommand()
                If File.Exists(documentFileName) Then
                    Try
                        Using wait As WaitCursor = New WaitCursor()

                            pageImage = _rasterCodecs.Load(documentFileName)

                            '图片增强
                            'command.Run(pageImage)
                            '_rasterCodecs.Save(pageImage, "E:\2016-1-12海航扫描图片\临时加强文件\" + Path.GetFileName(filePath), Leadtools.RasterImageFormat.Tif, 1, pageImage.Page, pageImage.PageCount, 1, Leadtools.Codecs.CodecsSavePageMode.Overwrite)
                            'If image Is Nothing Then
                            '    image = pageImage
                            'Else
                            '    image.AddPage(pageImage)
                            '    pageImage.Dispose()
                            'End If
                        End Using
                    Catch ex As Exception
                        Messager.ShowFileOpenError(owner, documentFileName, ex)
                    End Try
                End If
                'Next documentFileName


                Dim [error] As Exception = Nothing

                Dim ImgWidth As Integer
                Dim ImgHeight As Integer
                If pageImage Is Nothing Then
                    Return returnBarcode
                Else
                    ImgWidth = pageImage.Width
                    ImgHeight = pageImage.Height
                End If

                ' Continue on errors
                '_barcodeEngine.Reader.ErrorMode = BarcodeReaderErrorMode.IgnoreAll
                'AddHandler _barcodeEngine.Reader.ReadSymbology, AddressOf Reader_ReadSymbology

                '面卡,返回条码&FAACE
                '普通例行工卡和非单,返回条码
                Dim countExp As Integer = 0 '记录读取出错次数
                'Dim countDoBarcode As Integer = 0 '记录读取次数
                Dim regAz As Regex = New Regex("^[A-Za-z]+$")
dotry:
                Try
                    endtime = Now()
                    Debug.Print("doreadbarcodes before ReadBarcodes :" & (endtime - starttime).TotalMilliseconds)
                    starttime = Now()

                    _barcodeEngine.Reader.ErrorMode = BarcodeReaderErrorMode.IgnoreAll
                    barcodes = _barcodeEngine.Reader.ReadBarcodes(pageImage, LogicalRectangle.FromLTRB(0, 0, ImgWidth, ImgHeight, LogicalUnit.Pixel), 0, BarcodeEngine.GetSupportedSymbologies(), Nothing)

                    endtime = Now()
                    Debug.Print("doreadbarcodes ReadBarcodes:" & (endtime - starttime).TotalMilliseconds)
                    starttime = Now()
                    'countDoBarcode += 1
                Catch ex As Exception
                    [error] = ex
                    countExp += 1
                    'Application.DoEvents()
                    Debug.Print("ReadBarcodes: " & ex.Message & vbCrLf & ex.StackTrace)
                    If countExp > 3 Then
                        'Messager.ShowInformation(owner, documentFileName & "读取条码出错")
                        barcodes = Nothing
                        GC.Collect()
                        Exit Try
                    End If
                    GC.Collect()

                    Debug.Print("读取条码出错:" & documentFileName & vbCrLf & ex.Message & vbCrLf & ex.StackTrace)
                    GoTo dotry
                    'Return returnBarcode
                End Try

                regAz = Nothing

                pageImage.Dispose()
                _barcodeEngine = Nothing
                _rasterCodecs = Nothing
                command = Nothing

            Else
                barcodes = Nothing
            End If


            'Dim pageBarcodes As PageBarcodes = New PageBarcodes()
            If barcodes IsNot Nothing Then
                For Each barcode As BarcodeData In barcodes
                    'pageBarcodes.Barcodes.Add(barcode)
                    If barcode.Value.Contains("AA-") Then
                        returnBarcode = barcode.Value
                        'If returnBarcode.Length >= 15 AndAlso regAz.IsMatch(returnBarcode.Substring(3, 12)) AndAlso countDoBarcode < 5 Then '条形码中有字母,返回读取不到5次
                        '    GoTo dotry
                        'End If
                    ElseIf barcode.Value = "FACE" Then
                        returnBarcodeFace = "FACE"
                    ElseIf barcode.Value.Contains("BA-") Then
                        returnBarcode = barcode.Value
                        'If returnBarcode.Length >= 15 AndAlso regAz.IsMatch(returnBarcode.Substring(3, 12)) AndAlso countDoBarcode < 5 Then '条形码中有字母,返回读取不到5次
                        '    GoTo dotry
                        'End If
                        Exit For
                    End If
                Next barcode
                returnBarcode = returnBarcode & returnBarcodeFace
            End If

            If System.IO.File.Exists(documentFileName) Then
                System.IO.File.Delete(documentFileName)
            End If

            GC.Collect()

            endtime = Now()
            Debug.Print("doreadbarcodes end:" & (endtime - starttime).TotalMilliseconds)

            Return returnBarcode

        End Function
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-7-6 11:24:02
5#
imp1212 发表于 2016-7-6 10:33
经我方多次测试,锁定为该方法导致的内存增加:
TmpBarcode = tw.DoReadBarcodes(PicPath, Me)
该方法调 ...

通过你的代码,我怀疑有可能有以下两个原因导致内存递增。
1、Debug模式下,GC不工作。
     Visual Studio在调试过程中,GC是不工作的,因为可以让程序员方便的看到各种变量的值。所以如果要测试GC回收功能,请将程序Release到一个目录下,然后单独运行这个EXE,在资源管理器中查看内存是否会减少。如果仍旧递增,则为释放问题。
2、DoReadBarcode方法中,多次创建RasterCodec、BarcodeEngine实例。
如果我没有猜错,这个DoReadBarcode会在外部进行循环调用,而在这个方法中,RasterCodec、BarcodeEngine每次都会重新创建,这两个功能性对象释放的时机会由Leadtools.dll来决定,所以建议是在外部创建一次,在这个方法里进行使用就可以。
回复 使用道具 举报
imp1212
初级会员   /  发表于:2016-7-6 13:23:36
6#
AvoCaDolol 发表于 2016-7-6 11:24
通过你的代码,我怀疑有可能有以下两个原因导致内存递增。
1、Debug模式下,GC不工作。
     Visual St ...

好的,我试一下,谢谢!
回复 使用道具 举报
imp1212
初级会员   /  发表于:2016-7-6 13:49:04
7#
AvoCaDolol 发表于 2016-7-6 11:24
通过你的代码,我怀疑有可能有以下两个原因导致内存递增。
1、Debug模式下,GC不工作。
     Visual St ...

你好,关于你的方案的回复:
1.使用exe而不是编译环境运行,内存依然增加。
2.对你所说的两个实例,在外部进行了创建和赋值,只调用了一次,内存依然增加。
回复 使用道具 举报
imp1212
初级会员   /  发表于:2016-7-6 14:56:33
8#
AvoCaDolol 发表于 2016-7-6 11:24
通过你的代码,我怀疑有可能有以下两个原因导致内存递增。
1、Debug模式下,GC不工作。
     Visual St ...

请问其他用户在.net环境下,循环使用该方法时没发生过内存的问题吗?
回复 使用道具 举报
imp1212
初级会员   /  发表于:2016-7-7 13:50:46
9#
AvoCaDolol 发表于 2016-7-6 11:24
通过你的代码,我怀疑有可能有以下两个原因导致内存递增。
1、Debug模式下,GC不工作。
     Visual St ...

目前已经基本排除leadtools以外影响内存的所有因素。
请尽快协助我们解决该问题。该问题已导致我们的客户频繁发生由于内存增加而产生的闪退现象。谢谢。
回复 使用道具 举报
AvoCaDolol活字格认证 Wyn认证
社区贡献组   /  发表于:2016-7-7 15:19:28
10#
imp1212 发表于 2016-7-7 13:50
目前已经基本排除leadtools以外影响内存的所有因素。
请尽快协助我们解决该问题。该问题已导致我们的客 ...

能否将你的工程代码发送给我:leadtools.xa@grapecity.com
我帮助你调试一下,查看问题出在哪里。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部