Avatar billede angelenglen Nybegynder
14. november 2012 - 14:48 Der er 3 kommentarer og
1 løsning

VB.Net Memory leak?

Jeg har et *meget* simpelt vb.net projekt, der ikke gør andet end at vise en webbrowser i fuld skærm, og genindlæse url'en hvert minut.
websiden der vises indeholder en embedded Windows Media Player der viser video i fuld skærm.

Denne kombination får åbenbart applikationens hukommelsesforbrug til at løbe løbsk, og jeg forstår ikke hvorfor.

Her er al den kode der er nødvendig for at kunne genskabe problemet.

1. Form1.vb (standard Windows Forms projekt, der er ikke lavet nogen indstillinger for formen overhovedet)
Imports System.IO
Public Class Form1
    Private myTimer As Timer
    Private strLoadURL As Uri = New Uri("http://localhost/videotest.html?_=" & DateValue(Now).ToString())
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        Me.WindowState = FormWindowState.Maximized
        WebBrowser1.Url = strLoadURL
        myTimer = New Timer
        myTimer.Interval = 60000
        AddHandler myTimer.Tick, AddressOf myTimer_Tick
        myTimer.Start()
    End Sub
    Private Sub myTimer_Tick(sender As System.Object, e As System.EventArgs)
        WebBrowser1.Navigate(strLoadURL)
        Using sw As New StreamWriter("mylog.log", True)
            Using process As Process = process.GetCurrentProcess()
                sw.WriteLine("Time: " & Now & " - Memory: " & FormatNumber(((process.WorkingSet64) / 1024 / 1024), 2) & " MB")
            End Using
        End Using
    End Sub
End Class


2. videotest.html
<html>
<head>
<title>Video Player</title>
<script type="text/javascript">       
var wmPlayer;
function createPlayer() {
    wmPlayer = '<object type="video/x-ms-wmv" data="play.asx" width="100%" height="100%">';
    wmPlayer = wmPlayer + '    <param name="src" value="play.asx" />';
    wmPlayer = wmPlayer + '    <param name="autoStart" value="true" />';
    wmPlayer = wmPlayer + '    <param name="autoPlay" value="true" />';
    wmPlayer = wmPlayer + '    <param name="controller" value="false" />';
    wmPlayer = wmPlayer + '    <param name="showControls" value="false" />';
    wmPlayer = wmPlayer + '    <param name="showControls" value="false" />';
    wmPlayer = wmPlayer + '    <param name="ShowStatusBar" value="false" />';
    wmPlayer = wmPlayer + '    <param name="kioskMode" value="true" />';
    wmPlayer = wmPlayer + '    <param name="PlayCount" value="9999" />';
    wmPlayer = wmPlayer + '</object>';
    setTimeout("document.getElementById('playerDiv').innerHTML = wmPlayer;",100);
}
</script>
</head>
<body bgcolor="#000000" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" onload="createPlayer();">
<div id="playerDiv">
    <table border="0" cellpadding="0" cellspacing="0" height="100%" width="100%">
    <tr valign="center"><td align="center">
        <span style="color: #FAFAFA;"><h1>Loading video feed...</h1></span>
    </td></tr>
    </table>
</div>
</body>
</html>


3. play.asx
<ASX Version = "3.0">
    <ENTRY><REF HREF="video-001.wmv"/></ENTRY>
    <ENTRY><REF HREF="video-002.wmv"/></ENTRY>
    <ENTRY><REF HREF="video-003.wmv"/></ENTRY>
    <ENTRY><REF HREF="video-004.wmv"/></ENTRY>
    <ENTRY><REF HREF="video-005.wmv"/></ENTRY>
</ASX>


4. video-filer [41 MB] (dette er bare nogle sample videoer jeg fandt, men de forsager problemet på præcis samme måde)
http://angel.thespirit.dk/sample-videoes.zip


Alle filerne skal placeres i samme mappe - ret evt. stien til i stedet for localhost til c:\osv, hvis du ikke har en lokal IIS kørende.


Her er et eksempel på log-outputtet:
Time: 14-11-2012 11:17:38 - Memory: 82,68 MB
Time: 14-11-2012 11:18:38 - Memory: 90,18 MB
Time: 14-11-2012 11:19:38 - Memory: 109,77 MB
Time: 14-11-2012 11:20:38 - Memory: 124,77 MB
Time: 14-11-2012 11:21:38 - Memory: 138,75 MB
Time: 14-11-2012 11:22:38 - Memory: 162,51 MB
Time: 14-11-2012 11:23:38 - Memory: 186,46 MB
Time: 14-11-2012 11:24:38 - Memory: 214,47 MB
Time: 14-11-2012 11:25:38 - Memory: 233,16 MB
Time: 14-11-2012 11:26:38 - Memory: 244,76 MB
Time: 14-11-2012 11:27:38 - Memory: 264,88 MB
Time: 14-11-2012 11:28:38 - Memory: 280,09 MB
Time: 14-11-2012 11:29:38 - Memory: 309,86 MB
Time: 14-11-2012 11:30:38 - Memory: 322,18 MB
Time: 14-11-2012 11:31:38 - Memory: 329,05 MB
Time: 14-11-2012 11:32:38 - Memory: 342,84 MB
Time: 14-11-2012 11:33:38 - Memory: 348,21 MB
Time: 14-11-2012 11:34:38 - Memory: 357,53 MB
Time: 14-11-2012 11:35:38 - Memory: 402,77 MB
Time: 14-11-2012 11:36:38 - Memory: 397,16 MB
Time: 14-11-2012 11:37:38 - Memory: 416,07 MB
Time: 14-11-2012 11:38:38 - Memory: 416,41 MB
Time: 14-11-2012 11:39:38 - Memory: 416,59 MB
Time: 14-11-2012 11:40:38 - Memory: 416,68 MB
Time: 14-11-2012 11:41:38 - Memory: 413,80 MB
Time: 14-11-2012 11:42:38 - Memory: 413,90 MB
...osv.

Som det kan ses rammer den ret hurtigt de 400 MB, men allerede efter få minutter står det klart at hukommelsesforbruget bare stiger og stiger.

Så snart den rammer ca. 400 mb, begynder videoplayeren at hakke, og kort derefter viser den bare sort skærm i stedet for videoen.
Derefter bruger den ca. 410-420 MB fremover. Det kan den umiddelbart blive ved med, indtil programmet lukkes manuelt.

Jeg har forresten prøvet at lave præcis den samme funktionalitet i C#.Net, og der ligger hukommelsesforbruget stabilt omkring de 88 MB.
Desværre er omskrivning C#.Net ikke umiddelbart en brugbar løsning på problemet for mig.
Avatar billede arne_v Ekspert
20. november 2012 - 01:08 #1
C# og VB.NET oversaettes til det samme, saa hvis der er forskel i opfoersel saa er der forskel i koden!

Det var da oplagt at forsoege at identificere den forskel.
Avatar billede angelenglen Nybegynder
20. november 2012 - 15:43 #2
Helt enig, der burde ikke være forskel. Overhovedet.

Men som du kan se er det nu et ret simpelt script, så jeg mener ikke der er så meget der kan gå tabt i oversættelsen til C#.

Har endda prøvet flere forskellige udgaver af scriptet i C#, det fejler aldrig, ligesom VB gør hver gang.

Jeg er meget puzzled over dette.
Avatar billede angelenglen Nybegynder
09. januar 2013 - 12:53 #3
Endte med at opgive projektet.
Avatar billede janus_007 Nybegynder
10. januar 2013 - 23:31 #4
I C# giver det et memory leak at gøre sådan her:

Using process As Process = process.GetCurrentProcess()
                sw.WriteLine("Time: " & Now & " - Memory: " & FormatNumber(((process.WorkingSet64) / 1024 / 1024), 2) & " MB")
            End Using


Jeg ville istedet gøre sådan:
Using process As Process
var currentProcess = process.GetCurrentProcess()
                sw.WriteLine("Time: " & Now & " - Memory: " & FormatNumber(((currentProcess.WorkingSet64) / 1024 / 1024), 2) & " MB")
            End Using
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester