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
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.