winfrom占用内存过大,最小化后会释放很多内存,应怎样处理,防止内存占用过大

wangjiao2011 2011-08-15 08:58:13
winfrom占用内存过大,最小化后会释放很多内存,应怎样处理,防止内存占用过大
写的程序才50多M,查了一下内存,占了60M左右,虚拟内存也占60m左右,最小化程序后内存只占了2m左右,虚拟内存基本没变,在最大化内存占用在10M左右,虚拟内存也没增加,如果运行一段时间,打开一些窗口内存增长很大,这是怎么回事,是不是关闭子窗体后没有立即释放内存,是不是要手动调用dispose方法释放内存。请高手指点。谢谢
...全文
295 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
窗户纸 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
winfrom占用内存过大,最小化后会释放很多内存,应怎样处理,防止内存占用过大
写的程序才50多M,查了一下内存,占了60M左右,虚拟内存也占60m左右,最小化程序后内存只占了2m左右,虚拟内存基本没变,在最大化内存占用在10M左右,虚拟内存也没增加,如果运行一段时间,打开一些窗口内存增长很大,这是怎么回事,是不是关闭子窗体后没有立即释放内存,是不是要手动调用dispose方法释放内存。请高手……
[/Quote]
写的程序50M,在.net领域下算是巨型系统了(5千万个字节,就算20个字节为一条语句,那也有250万条语句),赶超我们的解放军女兵了。如果加上“才”,那就超牛了。貌似50k更确切些吧。如果真是50MB,执行的功能有很少,只能说里面放了多媒体(图片)占数据太多了。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
是不是关闭子窗体后没有立即释放内存,是不是要手动调用dispose方法释放内存
[/Quote]

释放进程所声明的内存空间,跟什么“手动调用dispose方法”半点关系也没有。dispose充其量你可以说是“释放资源”,但是释放什么资源?你了解过吗?
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
winfrom占用内存过大,最小化后会释放很多内存,应怎样处理,防止内存占用过大
写的程序才50多M,查了一下内存,占了60M左右,虚拟内存也占60m左右,最小化程序后内存只占了2m左右,虚拟内存基本没变,在最大化内存占用在10M左右,虚拟内存也没增加,如果运行一段时间,打开一些窗口内存增长很大,这是怎么回事,是不是关闭子窗体后没有立即释放内存,是不是要手动调用dispose方法释放内存。请高手……
[/Quote]

我想问问你的机器上有多少内存?

假设我们的服务运行了一整天,结果它占用内存300M,这我非常欣慰。因为这说明不少内容快速地缓存起来了,让程序运行得更好。我们的服务器只是一台低档的PC机,只有区区2G物理内存,而且开着数据库服务器、web服务器等等,那么连我们自己的业务加起来其内存占用可能也不过平均1.3个G,有什么必要担心内存不够的?非要宁可牺牲程序正常运行效率也要把内存暂时释放到2M?仅仅为了欺骗客户一下(给客户炫耀一下我们会在程序管理器的显示窗口上作假)?
「已注销」 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 6 楼 jy02305022 的回复:
C# code


#region 回收内存方法组
/// <summary>
/// 设置操作系统实际划分给进程使用的内存容量
/// </summary>
/// <param name="hProcess">指定一个进程的句柄</param>
/// <param name="dwMinimumWorkingSetSize">……
[/Quote]

哥哥 你20分也要结贴啊,我没分用了
「已注销」 2011-08-15
  • 打赏
  • 举报
回复

#region 回收内存方法组
/// <summary>
/// 设置操作系统实际划分给进程使用的内存容量
/// </summary>
/// <param name="hProcess">指定一个进程的句柄</param>
/// <param name="dwMinimumWorkingSetSize">用于装载最小进程容量的一个变量</param>
/// <param name="dwMaximumWorkingSetSize">用于装载最大进程容量的一个变量</param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern int SetProcessWorkingSetSize(IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

private static readonly Version myVersion = new Version(1, 0);
/// <summary>
/// 将当前进程的内存占用尺寸设置到最小
/// </summary>
/// <returns>0为成功,-1为失败</returns>
public static int SetProcessMemoryToMin()
{
return SetProcessMemoryToMin(System.Diagnostics.Process.GetCurrentProcess().Handle);
}
/// <summary>
/// 将内存占用尺寸设置到最小
/// </summary>
/// <param name="SetProcess">需要设置内存使用范围的程序进程句柄,一般为当前进程,如:System.Diagnostics.Process.GetCurrentProcess().Handle</param>
/// <returns>0为成功,-1为失败</returns>
public static int SetProcessMemoryToMin(IntPtr SetProcess)
{
GC.Collect();
GC.Collect();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
return SetProcessWorkingSetSize(SetProcess, -1, -1);
}
return -1;
}
#endregion




在程序中直接调用
SetProcessMemoryToMin(); 即可


刚才发的是没有发上来还是被删掉了??? 为什么???
xxiju203 2011-08-15
  • 打赏
  • 举报
回复
50M的程序?什么样的程序需要做得那么大?其中有20M的固定分配给.Net环境的, 要像不占用过多的内存,使用过的对象记得及时手动销毁,比如Image Graphic等类就很占内存,不要等到GC来帮你回收资源.一些程序内部使用的资源可以放在外部的文件中 使用的时候进行调用即可.不需要都包含在项目中.
mjp1234airen4385 2011-08-15
  • 打赏
  • 举报
回复
GC.Collect();
流浪的青春 2011-08-15
  • 打赏
  • 举报
回复
如果真是占用内存过多的话,最好在关闭子窗体的时候把窗体上每个控件都dispose,把定义的变量之类的也都设成null
老鼠爱上猫 2011-08-15
  • 打赏
  • 举报
回复
学习 ,,,,,
skyaihuacai 2011-08-15
  • 打赏
  • 举报
回复
俺也不清楚每次关闭窗体是不是要用dispose方法,同求解
一休宗纯 2011-08-15
  • 打赏
  • 举报
回复
50M内存有时根本不算什么了。
关键是,如何防止内存不断地膨胀!

比如说,一个应用程序,每过几秒就过自动增长5M内存。这样才可怕。

wangjiao2011 2011-08-15
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jy02305022 的回复:]
C# code


#region 回收内存方法组
/// <summary>
/// 设置操作系统实际划分给进程使用的内存容量
/// </summary>
/// <param name="hProcess">指定一个进程的句柄</param>
/// <param name="dwMinimumWorkingSetSize">用于装载最小进程容量的一个变量</param>
……
[/Quote]谢谢,顶
Binea 2011-08-15
  • 打赏
  • 举报
回复
学习了。。
杨友山 2011-08-15
  • 打赏
  • 举报
回复
System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess();
if (p.WorkingSet > 10240000)//界限
{
p.MaxWorkingSet = p.MaxWorkingSet;
}

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧