【发布时间】:2019-02-07 11:31:13
【问题描述】:
简单地说,如果没有连接显示器并且您正在嵌入式 Windows 8 上执行一些“windows”操作,dwm.exe 开始分配内存并且永不停止。
为了重新生成并向您展示所有问题,我编写了一个应用程序,该应用程序正在执行“创建一个新表单并显示它,如果创建了一个则先关闭它”
public partial class PopupWindows : Form
{
private Timer _t;
private Form _form;
public PopupWindows()
{
InitializeComponent();
this.Size = new Size(500, 500);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_t = new Timer();
_t.Tick += (o, ea) =>
{
_form?.Close();
(_form = new Form() { Size = this.Size }).Show();
};
_t.Interval = 1000;
_t.Enabled = true;
}
}
如果你运行这个应用程序并拔掉监视器,dwm 开始分配页面 这是 pslist -m 显示器连接时的输出
Name Pid VM WS Priv Priv Pk Faults NonP Page
dwm 840 123528 14400 11264 13044 55125 7 212
一段时间后显示器仍然连接
dwm 840 117144 15808 12732 13044 94051 7 200
断开监视器和dwm.exe开始分配
dwm 840 214660 14444 12664 13044 137409 13 400
下面是你可以看到分配 dwm.exe 的输出
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 251956 14460 12740 13044 137413 16 477
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 251956 14460 12740 13044 137413 16 477
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 251956 14460 12740 13044 137413 16 477
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 252964 14460 12740 13044 137413 16 479
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 252964 14460 12740 13044 137413 16 479
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 253972 14460 12744 13044 137413 16 481
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 253972 14460 12744 13044 137413 16 481
C:\PSTools>pslist.exe -m|findstr "dwm"
dwm 840 254980 14460 12744 13044 137413 16 483
这种奇怪的行为 dwm 一直在做从不停止,直到您连接显示器或将 vnc 连接到计算机。
无显示器运行一段时间后,每个操作系统组件开始抱怨内存,最后出现蓝屏死机。
让我给你看最后一张
dwm 840 807516 15624 14216 17240 147413 50 1603
这是显示我的 popupwindows.exe 运行了多少分钟的输出
Name Pid Pri Thd Hnd Priv CPU Time Elapsed Time
PopupWindows 2052 6 4 138 9468 0:00:00.140 0:23:07.332
如您所见,在设备上没有监视器约 20 分钟后,dwm.exe 使用 807516 字节 VM 和 1603 个页面。
【问题讨论】:
标签: windows memory-leaks dwm bsod