在Windows 8.1中,有没有一种方法可以确保在RAM不足时不是第一个被杀死的进程?


18

我编写了一个.NET 4.5应用程序,该程序可以缓冲Kinect v2中的颜色,红外和深度数据,对其进行一些处理,然后以未压缩的形式将其转储到磁盘中。.NET应用程序还将ffmpeg作为子进程启动,并将颜色数据通过管道传递给它,以编码为H.264。

因为我没有使用SSD,所以视频数据的到达速度比我写入磁盘的速度更快。但这没关系,当我的RAM不足时,我可以丢弃视频帧。我唯一的要求是,无论我保持什么,都是连续的8到10秒的视频块。因此,当我没有足够的RAM来缓冲连续8到10秒的视频(大约1.5到2 GB)的视频时,我在.NET 4.5应用程序中添加了一些逻辑以开始丢弃视频帧。

而且,为防止页面抖动,我已完全禁用页面文件。这给我留下了总共16 GB的物理RAM。

我的问题是,即使采用了这种机制,当Windows 8.1内存不足时,有时我的.NET应用程序或ffmpeg子进程仍然会被杀死,因为显然,当我的应用程序具有大量的视频数据积压时,我的应用程序将使用最多的RAM写入磁盘。有没有办法告诉Windows我的进程比其他进程更重要,以便Windows首先开始杀死其他不那么重要的进程?


10
我不认为Windows会杀死进程,我认为这只是Linux的功能。
Scott Chamberlain 2014年

4
@ScottChamberlain:这是因为在Windows上关闭分页文件非常罕见。它使您产生各种意外和异常的行为。显而易见的答案是“不要关闭分页文件;这会迫使Windows将未使用的数据保留在RAM中,因此您的应用程序将无法使用该RAM”
MSalters 2014年

1
如果这是一个StackOverflow问题,那么我可以指出一点,CreateMemoryResourceNotification这并不是很多问题。
MSalters 2014年

7
@Kal:如果磁盘访问是瓶颈,请使用更强的压缩,如果CPU是瓶颈,请使用更快的压缩。如果两者都是瓶颈,请重新考虑整个设计并重新开始,或者获得更好的硬件。
Mooing Duck

1
@FactorMystic OMG他做了什么?禁用页面文件将大大减少可用的RAM。
阿隆2014年

Answers:


45

使用所有RAM时,Windows不会终止进程。实际发生的情况是进程无法分配内存并崩溃。

之所以发生这种情况,是因为所有物理内存都在使用中,并且由于禁用了页面文件,因此内存管理器不再能够写入未使用的页面。这样可以使您的物理RAM保持满,并且当您的进程或当时运行的任何其他程序试图分配页面时,它将失败。某些应用程序崩溃。

来自Technet的演示文稿解释了:http : //channel9.msdn.com/Events/TechEd/NorthAmerica/2011/WCL405

当您利用所有内存作为过量承诺的支持者时,页面文件可防止应用程序崩溃。

虚拟内存几乎是现代操作系统分配资源的基础,因此,所有有关内存中正在使用的东西以及将内容移入和移出磁盘的所有操作。

实际上只有两个答案:

  1. 重新启用页面文件并增加计算机上的RAM,以减少磁盘抖动。
  2. 减少应用程序的内存需求。

最重要的是,RAM只是高速缓存的另一级,有关虚拟内存,页面文件,内存映射文件以及基本上所有这些内容的所有内容都可以归结为:如果内存不足,则需要添加更多。


4
或者少用....
nhgrif

1
请注意,积压的积压是因为无法将数据足够快地写入磁盘。我认为在同一磁盘上启用虚拟内存不会对此有所帮助……
Alexander

3
实际上,页面文件将位于磁盘上的其他位置。而且由于我们知道它不是SSD,所以这意味着物理搜索是最慢的磁盘操作。
MSalters 2014年

9
听起来您需要在应用程序中进行显式的内存管理,然后……
Joe

1
@乔正是这样。在这种情况下,垃圾收集器将使内存管理成为一场噩梦。在C ++中,这种情况对我来说微不足道,因为我可以对所有内存使用情况进行微调控制。尽管在C#中也有一些适用于这种情况的设计模式,但它并不像大多数人想要的那样简单。
Thebluefish 2014年

0

进入“ Windows工具面板”和“高级设置”,并禁用不需要的东西(如尚未使用的窗口效果),然后让Sysinternals Process Explorer和/或“系统监视器”查找并关闭所有浪费CPU或内存的东西。

更重要的是,使用Process Explorer和/或System Monitor来观察程序的执行情况,并准确查看程序在何处以及如何失败。哪个线程内存不足并先死-主要prgm或ffmpeg部分?是否存在特定的dll或其他共享资源,其大小意外增加?还是执行成功,只是要花费更多的精力去咀嚼数据?

更准确地找出问题的性质可能会为您指明解决方案的方向。例如,您可以更积极地实施丢帧策略,同时针对8-10秒的块条件进行更好的优化,从而降低总体RAM开销

最终建议:也许考虑切换到Linux,与此同时,重新启用页面文件(Linux称为交换空间,这使它听起来更有趣,恕我直言,就像交换会议之类的!)祝您好运。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.