`
Zaki
  • 浏览: 50543 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

有效减少WinForm程序的内存占用 C#

    博客分类:
  • C#
阅读更多

最近发现了这么一句代码:

System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)maxWorkingSet;

学习一下:

---------------------------------------------------------------

 

微软的 .NET FRAMEWORK 现在可谓如火如荼了。但是,.NET 一直所为人诟病的就是“胃口太大”,狂吃内存,虽然微软声称 GC 的功能和智能化都很高,但是内存的回收问题,一直存在困扰,尤其是 winform 程序,其主要原因是因为.NET程序在启动时,是需要由JIT动态编译并加载的,这个加载会把所有需要的资源都加载进来,很多资源是只有启动时才用的。

XP 系统为例子,程序启动后,打开任务管理器,会看到占用的内存量比较大,你把程序最小化,会发现该程序占用的内存迅速减小到一个很小的值,再恢复你的程序, 你会发现内存占用又上升了,但是比你刚启动时的内存占用值还是小的,这就是一个资源优化的过程,这个过程是操作系统主动完成的。

上面的情况,在 vista 下并不是这样的,最小化后,内存占用量不会改变,说明vista对内存的管理比XP优秀(个人意见 )。



 进程的工作集是物理 RAM 内存中当前对该进程可见的内存页的集合。这些内存页是常驻内存,

可供应用程序使用,而不会触发页面错误。

工作集包括共享数据和私有数据。共享数据包括那些包含应用程序执行的所有指令的页

(包括 .dll 文件和 system.dll 文件中的页)。随着工作集大小的增加,内存需求也增加。

进程具有最小和最大的工作集大小。每次创建进程资源时,系统都会保留等于该进程最小工作集

大小的内存量。虚拟内存管理器会尝试在进程处于活动状态时至少保留最小的常驻内存量,

但决不会保留超过最大大小的内存量。

系统设置默认工作集大小。可以使用 MaxWorkingSetMinWorkingSet

 成员修改这些大小。

但是,设置这些值并不保证将保留或驻留该内存。



 说明:



当您增加进程的工作集大小时,您就从系统的其余部分取走了物理内存。

确保不要请求太大的最小或最大工作集大小,因为这样做会降低系统性能。

下面给出我实测的一些数据:



 测试用例:只有一个窗体的空白winform程序,.net frame 2.0

XP SP3 操作系统

启动后:

1

最小化后:

2

还原后:

3



 通过上面三个图,大家可以很明白的看到 内存 的变化情况。
一个再简单不过的.net的winform程序,启动后都要占用7M左右的内存。
所以,作为一种投机取巧的办法: 在程序启动完成后,先最小化程序,再还原,也是一种节约资源的方法,嘿嘿

Vista SP1 32位 操作系统

启动后:

4

最小化后:

5

还原后:

6



 有上面的三幅图,可以看到,在 vista 下, 内存基本没有变化。

而且在vista下的,同一个程序, 内存只占用了 2M 多一点, 比 XP 好了很多。

下面开始我们要说的 WorkingSet 的部分

.net 的 Process 有一个 WorkingSet64 的属性,表示当前进程所占用的物理内存值,是以字节为单位的。Process 还具有 MaxWorkingSet 和 MinWorkingSet 及相关的一些属性, 其中 MaxWorkingSet 的默认值是 1413120 字节,MinWorkingSet 的默认值是 204800 字节。

我们可以通过设置 进程的 MaxWorkingSet 的值, 来降低其内存使用量,但是这个值的设置,一定要合理,否则可能会适得其反。对于我们的上面的测试程序,只需要在 Form_Load 事件里,加入一句:

System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet = (IntPtr)750000;

大家就可以看到效果了, 但是还有个问题, 经过这次设置后, 随着程序的运行,它所占用的内存会逐步回升, 所以, 我们需要定时去设置一下进程的 MaxWorkingSet 值, 这个工作, 交给一个 timer 就OK了。

 

具体步骤:

通过设置当前进程的MaxWorkingSet值来调整程序的内存占用:

public static void SetWorkingSet(int maxWorkingSet)
{
    System.Diagnostics.Process.GetCurrentProcess().MaxWorkingSet
    	= (IntPtr)maxWorkingSet;
}

定义一个maxWorkingSet值:

int maxWorkingSet = 750000;

在窗体加载和窗体被停用时调用此静态方法:

private void Form1_Load(object sender, EventArgs e)
{
    Working.SetWorkingSet(maxWorkingSet);
}
private void Form1_Deactivate(object sender, EventArgs e)
{
    Working.SetWorkingSet(maxWorkingSet);
}
分享到:
评论

相关推荐

    C# Winform windows运行内存释放

    本项目“C# Winform Windows运行内存释放”旨在解决计算机运行过程中内存占用过高导致的性能问题。通过编写这样的小程序,我们可以帮助用户管理他们的系统资源,提高计算机的响应速度和整体性能。 在Windows操作...

    Winform程序怎么降低占用的内存?

    为了有效地降低Winform程序的内存占用,我们可以从以下几个方面入手: ### 1. 优化对象管理 - **适时释放资源**:在不再需要某个对象时,及时调用`Dispose()`方法或使用`using`语句来确保资源得到及时释放。例如,...

    C# WinForm应用程序降低系统内存占用方法总结

    本文总结了9种方法来降低C# WinForm应用程序的内存占用,旨在帮助开发者创建更加高效的应用。 1. **使用性能测试工具**:dotTrace 3.0是一款强大的性能分析工具,它可以帮助开发者识别程序中哪些代码段消耗内存最多...

    C# winform程序实现分页的方法

    ### C# Winform程序实现分页的方法 在处理大量数据时,一次性加载所有数据到内存中不仅会增加程序的资源占用,还可能导致程序运行效率降低甚至崩溃。因此,实现有效的分页功能对于提升用户体验和系统性能至关重要。...

    C#Winform动态调用C++和C#的Dll

    在IT行业中,动态链接库(DLL)是一种共享代码的方式,它可以被多个应用程序同时使用,以减少内存占用并提高效率。本文将重点讲解如何在C#的Winform应用中动态调用C++和C#编写的DLL,并将DLL作为嵌入资源处理,避免...

    C# winform 运行前释放令一个文件(或DLL)

    总之,C# WinForm程序中通过运行前释放DLL,可以实现动态加载、优化资源使用、提高安全性等多种目标。不过,这也需要开发者对.NET框架、程序部署和异常处理有深入的理解,以便在实际操作中避免潜在的问题。

    C#Winform报表系统

    可以通过数据分页、懒加载等技术减少内存占用,提高加载速度。 总的来说,C# Winform报表系统是开发人员在桌面应用中展示和分析数据的强大工具。通过熟练掌握报表设计、数据绑定和交互功能,开发者可以构建出满足...

    c# winform程序右下角通知实现实例NotifyIcondemo

    在C# WinForm应用程序开发中,`NotifyIcon`组件是一个非常重要的工具,它允许程序员在系统托盘(屏幕右下角)显示一个图标,并通过该图标提供用户通知和交互功能。`NotifyIcon`实例通常用于那些不需要在任务栏中显示...

    C#操作excel 打开-读取-修改-保存 winform入门操作

    当处理大量数据时,考虑使用`Value2`属性代替`Value`,以减少内存占用。此外,可以使用批处理更新来提高性能,例如批量设置单元格值。 通过以上步骤,初学者可以在C#的Winform应用中实现对Excel文件的基本操作。...

    WinForm(C#) DataGridView简单应用示例

    可以通过虚拟化技术,只在需要时加载数据行,以减少内存占用。 11. **扩展功能** `DataGridView`还有许多高级功能,如行选择模式、分组、自定义绘制等,可以根据需求进行探索和应用。 这个示例项目可能包含了创建...

    c# winform拼图小程序.zip|拼图小程序.zip

    例如,可以先加载缩略图,只有在需要时才加载全分辨率图像,或者使用内存映射文件减少内存占用。 10. **测试与调试**: 完成代码编写后,进行详尽的测试以确保所有功能都能正常工作。可以使用Visual Studio的调试...

    DLL注入到EXE的一个winform程序

    它们减少了内存占用,因为多个程序可以共享同一块内存空间。DLL注入则是在不修改目标EXE程序的情况下,通过在目标进程中创建新的线程或进程,将DLL加载到其地址空间,从而实现对目标程序行为的操控。 在这个“DLL...

    C# WinForm 远程控制桌面

    9. **性能优化**:对于大规模部署或高性能要求的场景,可能需要进一步优化,例如使用多线程处理网络通信和图像处理,减少CPU和内存占用。 通过以上步骤,我们可以构建一个基本的C# WinForm远程控制桌面应用。当然,...

    C# winform 做水晶报表

    6. **优化性能**:对于大数据量的报表,可以考虑使用数据虚拟化或预览数据集,以减少内存占用和提高显示速度。 7. **部署应用**:在发布应用程序时,别忘了包含水晶报表的运行时组件,以确保目标机器上能够正确运行...

    C# excel表格的读写和操作(winform)

    6. **性能和兼容性**:EPPlus比NPOI更适合大数据处理,因为它可以将数据写入内存流,从而减少内存占用。而NPOI对于旧版的.xls格式支持更好。 7. **WinForm集成**:在WinForm应用中,你可能需要创建用户界面供用户...

    C# winform ListView 中实现可编辑文本或双击出现下拉列表框

    8. **性能优化**: 考虑到性能,可能需要实现虚拟化以减少内存占用,特别是当ListView包含大量项时。 在实现这个自定义控件的过程中,可能还需要考虑其他细节,比如处理键盘焦点、撤销/重做功能、错误处理以及如何在...

    拼图游戏 C# winform

    例如,可以使用内存流(MemoryStream)加载图像,减少内存占用。 10. **调试与测试**:在开发过程中,使用Visual Studio的调试工具来查找并修复错误,确保游戏运行顺畅。 以上是开发C# Winform拼图游戏的主要技术...

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库、工具类库、扩展类库、多页面开发框架

    1. 页面管理:支持动态加载和卸载页面,减少内存占用。 2. 标签切换:用户可以方便地在多个页面间切换,提升操作流畅性。 3. 数据共享:实现页面间数据的传递和共享,提高程序协同性。 4. 响应式设计:适应不同...

    C# winform分页附带数据库

    分页是大数据量展示时的重要技术,它能够有效地减少内存占用,提高用户界面的响应速度。 首先,我们需要理解什么是分页。分页是将大量数据分为多个部分(页)来显示,每次只加载一部分数据到界面上,用户可以通过...

    针对List对象的Winform分页c#控件

    这样可以减少内存占用,提高程序响应速度。在Winform应用中,通常是通过控件如DataGridView或自定义控件来实现这一功能。 3. **C#控件开发**:在C#中,可以通过继承自System.Windows.Forms.Control类来创建自定义...

Global site tag (gtag.js) - Google Analytics