我有一个程序,当它打开一个页面时会逐个浏览网址链接,它会增加内存使用量并继续增加.i在两三个小时之后发现它占用了我的内存的1和半gb来打开一个hunderd页面我该如何解决这个问题。
答案 0 :(得分:2)
SetProcessWorkingSetSize实际上不会释放任何内存。 它确实增加了被分页到磁盘的内存的概率, 并可能导致GC收集。
我不了解WebBrowser控件的后台工作方式,但我意识到一件事:
我的程序会浏览500页或更多页面并在其上读取新内容。它占用了RAM 很快,如果我再次运行所有这些页面的相同功能,它只是从webbrowser缓存中读取,因此只需要几秒钟即可完成。
这意味着我们只需要清除浏览器缓存以释放RAM。对?我发现 这个解决方案,但它不起作用。
http://support.microsoft.com/kb/326201/en-us
总是给我PrtectedMemoryException ...
好的,那么只有当我关闭我的应用程序时才能释放内存 当我处理我的webbrowser控件并创建一个新控件时,它没有被释放?
答案 1 :(得分:1)
根据this answer到the same question,内存在每个页面请求/加载时会增加,但会在一段时间内释放 - 这意味着它实际上不是内存泄漏。尝试最小化应用程序窗口 - 然后释放内存吗?
在这种情况下,您可以尝试通过此代码定期修剪应用程序的工作集(来自this forum thread,mike_t2e的答案):
// In class definition
[DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);
[DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
internal static extern IntPtr GetCurrentProcess();
// ...
// Call this when you want to trim the working set
IntPtr pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);
答案 2 :(得分:0)
RT _>它总是给我ProtectedMemoryException
。
将您的平台从项目属性更改为x86
- >建立或替换
returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);
internetCacheEntry.lpszLocalFileName 。