Web浏览器内存问题

Jua*_*uan 7 .net webbrowser-control

我有一个.NET应用程序需要使用a WebBrowser来自动浏览一堆页面.但是,如果我去谷歌并设置谷歌即时通讯,然后搜索任何内容并手动浏览下一个按钮几次,我的应用程序使用的内存将开始增加.

问题可能是Google Instant以某种方式保留了以前页面中的数据,但即使我在其他地方导航,例如"about:blank",使用的内存也不会减少.IE 9也会出现这个问题.我开始写下我在第60页使用的内存,这就是我得到的(使用IE 9):

Page 60: 180 MB
Page 70: 214 MB
Page 80: 245 MB
Page 90: 280 MB
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,内存几乎每10页增加30 - 35 MB.如果在我离开谷歌后将释放内存,这将不会成为问题.但事实并非如此.

我也试过这个并没有做任何事情.

编辑:我做了一个项目只是为了测试这个.这是我的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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我所做的是在Google 启用 Google即搜即得时搜索任何内容,然后按startButton(调用startButton_Click).大约80页之后,我按下stopButton,然后导航到"about:blank",然后返回Google并搜索其他任何内容并startButton再次按下.

我首先在我的PC上测试了这个,它有6 GB内存.当我达到1.5 GB时,应用程序停止响应,但我没有得到任何OutOfMemory异常.然后我在Windows 7和1 GB RAM的虚拟机上测试了它.当它达到大约300 MB时,我的应用程序中的Web浏览器变得没有响应.

如果按下freeMem调用的按钮,freeMemButton_Click内存将恢复(但请参阅我的Edit2).这样就"解决了"我的问题.但现在我的问题是为什么我需要打电话SetProcessWorkingSetSize?是不是Windows应该自动释放内存?另外,我不确定调用该函数是否会产生任何副作用.

我很确定这是一个错误.我应该继续报告吗?

Edit2:我测试了Stefan的解决方案(调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1))并没有修复它.内存在任务管理器上失败,但这只是显而易见的.在没有调用该功能后,尽可能多的浏览器导航变得无法响应,应用程序变得没有响应.

Ste*_*fan 4

如果没有任何原因,Windows 不会真正返回已释放的内存。唯一的原因是如果另一个应用程序需要该内存并且不再有其他可用内存。这就是为什么看起来内存使用量增加了。

尝试打电话

SetProcessWorkingSetSize (GetCurrentProcess(), -1, -1);

有时 - 这将迫使操作系统将所有释放的内存返回给操作系统。