DWM утечки памяти, когда монитор не подключен Windows 8 - PullRequest
0 голосов
/ 07 февраля 2019

Проще говоря, , если не подключен монитор , и вы выполняете какую-то операцию "windows" на встроенной операционной системе Windows 8, dwm.exe начинает выделять память и никогда не останавливается .

* 1006.* чтобы восстановить и показать вам все проблемы, я написал приложение, которое делает «Создайте новую форму и покажите ее, если она была создана, сначала закройте ее»
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 байт и 1603 страницы.

1 Ответ

0 голосов
/ 07 февраля 2019

Действуя так, как делал vnc (регулярно копируя растровое изображение на весь экран в память приложения), решил проблему выделения памяти dwm (я думаю, что dwm кэширует свои выходные данные, но никто не приходит и не запрашивает изменения, поэтому он хранит их все в памяти иникогда не чистит).

ниже - приложение, которое запускает скрытое и регулярно копирует изображение экрана в память приложения

public partial class HiddenForm : Form
{
    IntPtr _this;

    private System.Windows.Forms.Timer _timer;
    private Bitmap _bmp = null;
    public HiddenForm()
    {
        this.Visible = false;
        this.ShowInTaskbar = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.HandleCreated += (s, e) => _this = this.Handle;
        this.Load += (s, e) => this.Size = new Size(0, 0);
        CreateHandle();
        CreateControl();

        _timer = new System.Windows.Forms.Timer();
        _timer.Tick += _timer_Tick;
        _timer.Interval = 2000;
        _timer.Start();
    }

    private void _timer_Tick(object sender, EventArgs e)
    {
        if (Screen.PrimaryScreen == null)
            return;

        if (_bmp == null)
        {
            using (Graphics g = CreateGraphics())
            {
                _bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g);
            }
        }
        using (Graphics grp = Graphics.FromImage(_bmp))
        {
            grp.CopyFromScreen(0, 0, 0, 0, _bmp.Size);
        }
    }
}

вот вывод после запуска моего приложения

Name                Pid      VM      WS    Priv Priv Pk   Faults   NonP Page
dwm                 832  117876   20188   19624   35004   184497      7  185

убивая мое приложениес pskill, ожидающим некоторое время

dwm                 832  182388   20264   19852   35004   421343     11  317

оно начинает увеличиваться, чтобы перепроверить наше приложение, я запустил его снова, набрав

C:\HiddenForm.exe

и dwm.exe выделение памяти волшебным образом уменьшилось.

dwm                 832  126384   27900   27364   35144   556729      7  187
...