我有一個.NET應用程序需要使用WebBrowser
來自動瀏覽一堆頁面。但是,如果我訪問Google並設置Google即搜即得,然後搜索任何內容並通過下一個按鈕多次手動導航,則我的應用程序使用的內存將開始增加。WebBrowser內存問題
問題可能在於Google即時以某種方式保留了以前頁面的數據,但即使在導航到其他地方(例如「about:blank」)後,所用的內存也不會減少。此問題也出現在IE 9,我開始寫下來60頁用我的記憶中,這是我得到(與IE 9):
Page 60: 180 MB
Page 70: 214 MB
Page 80: 245 MB
Page 90: 280 MB
因此,大家可以看到,內存增加了幾乎成線性30 - 每10頁35 MB。如果在離開Google後離開內存,這將不會成爲問題。但不是。
我也試過this並沒有做任何事情。
編輯:我做了一個項目只是爲了測試這個。這裏是我的Form1
代碼:
namespace WebBrowserMemoryTest
{
public partial class Form1 : Form
{
private int _Pages;
public Form1()
{
InitializeComponent();
webBrowser1.Navigate("http://www.google.com");
}
private void startButton_Click(object sender, EventArgs e)
{
_Pages = 0;
timer1.Start();
}
private void stopButton_Click(object sender, EventArgs e)
{
timer1.Stop();
}
private void timer1_Tick(object sender, EventArgs e)
{
HtmlElement next = webBrowser1.Document.GetElementById("pnnext");
if (_Pages <= 90)
{
if (null != next)
{
string href = next.GetAttribute("href");
webBrowser1.Navigate(href);
_Pages++;
}
else
{
timer1.Stop();
MessageBox.Show("Next button not found");
}
}
else
{
timer1.Stop();
MessageBox.Show("Done");
}
}
private void goButton_Click(object sender, EventArgs e)
{
webBrowser1.Navigate(textBox1.Text);
}
private void freeMemButton_Click(object sender, EventArgs e)
{
MemoryManagement.FlushMemory();
}
}
public class MemoryManagement
{
[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr proc, int min, int max);
public static void FlushMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
}
}
我做的是搜索在谷歌任何與谷歌即時上轉身,然後按startButton
(其中調用startButton_Click
)。大約80頁後,我按stopButton
,然後導航至「about:blank」,然後返回Google並搜索其他內容並再次按startButton
。
我首先在我的PC上測試了這個,它具有6GB RAM。當我達到1.5 GB時,應用程序停止響應,但我沒有得到任何OutOfMemory
異常。然後我使用Windows 7和1 GB RAM在虛擬機上進行測試。當它達到大約300 MB時,我的應用程序中的Web瀏覽器變得無響應。
如果我按下freeMem
按鈕,調用freeMemButton_Click
,內存會回落(但看到我的Edit2)。這樣可以「解決」我的問題。但現在我的問題是爲什麼我需要撥打SetProcessWorkingSetSize
?它不是Windows應該自動釋放內存嗎?另外,我不確定是否調用該函數會有任何副作用。
我很確定這是一個錯誤。我應該繼續並報告嗎?
編輯2:我測試了斯蒂芬的解決方案(調用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1)
)並沒有解決它。內存在任務管理器中停頓下來,但這只是顯而易見的。在沒有調用該函數時,應用程序變得無響應之後,應用程序變得無響應。
你連接上網絡瀏覽器的任何事件處理程序? – 2011-06-26 06:08:55
沒有。只是你看到的代碼。 – Juan 2011-06-26 06:40:20
對此有何更新? – atwellpub 2012-03-23 20:51:15