我的应用程序中存在内存管理问题。应用程序内存在运行时期间快速增长。我在断开连接模式下使用数据集。为了解决这个问题,我经常刷新DS并使用SetProcessWorkingSetSize
来管理内存使用情况。它在我的开发计算机上运行良好。使用SetProcessWorkingSetSize
有哪些优缺点?
答案 0 :(得分:14)
SetProcessWorkingSetSize()控制进程使用的 RAM 的数量,否则不会对进程的虚拟内存大小产生任何影响。 Windows已经非常擅长动态控制它,当另一个进程需要RAM时,按需交换内存页面。通过手动执行此操作,可以大大减慢程序速度,当Windows被强制重新插入内存页时会导致大量页面错误.SetProcessWorkingSetSize通常用于增加分配的RAM量一个过程。或者当应用程序知道它将长时间闲置时强制修剪。当您最小化应用程序的主窗口时,也由旧Windows版本自动完成。
无需使用此btw,您可以使用Process.GetCurrentProcess.Min / MaxWorkingSet属性。
答案 1 :(得分:3)
我见过这个电话的唯一好用例是当你知道你的进程会占用很多系统的RAM并且你想在这段时间内保留它。你用它来告诉操作系统“是的,我将在整个运行过程中吃掉很多系统内存,并且不会妨碍我。”
在这种情况下,保留操作系统的默认行为是不好的。操作系统为每个进程分配一个默认的MB of MB-基本上是它的工作空间。它的资源管理启发式算法不是神谕,所以如果他们发现某些进程的占用方式超过其系统资源(如RAM)的份额,他们会尽可能多地追回过多的进程。对于您的过程,这意味着操作系统会浪费大量CPU(因此会损害您的性能),方法是在不需要时将内存分页输入和输出地址空间。
答案 2 :(得分:2)
我们发现,对于用Delphi for Win32 / Win64编写的GUI应用程序,或者以类似的方式编写在Win32 API(GDI等)上使用大型和重型库的GUI应用程序,值得调用SetProcessWorkingSetSize一次。
我们用-1,-1参数调用它,在应用程序完全打开后的几分之一秒内向用户显示主窗口。在这种情况下,SetProcessWorkingSetSize(... -1,-1)会释放许多似乎不再需要的启动代码。内存很快恢复到没有SetProcessWorkingSetSize(... -1,-1)时的1/3,但不会增长。因此,我们有效地节省了大部分启动代码(加载和解析配置文件,初始化GUI等)的2/3内存,这可能是不需要的。
如果你有一个GUI应用程序,你可以用同样的方式测试你自己的应用程序 - 只需调用一次,看看已经发布了多少内存。
即使对于没有GUI的服务器(服务)应用程序,我认为在服务器完全加载和初始化之后调用SetProcessWorkingSetSize可能是有用的。