﻿# 介紹好用工具：Desktop Heap Monitor

我之前其實也常遇到 "Windows桌面開太多東西就怪怪的" 的問題，仔細算了一下原來我的視窗已經開超過 30 個，30 個是有點扯，不過當時還在 IE 6 的時代，還沒有支援頁籤(Tab)功能，像我寫 Code 的時候都會開許多網頁查詢文件或測試，大腦的 Multithread 如火如荼的進行中，且在做 context switch (Alt+Tab) 時也很快，所以都不捨得關視窗，但就是常會遇到視窗怪怪的問題，一般的解法通常都是「重開機」或「登出然後重新登入」來解決這個問題。不過因為「有經驗」了，後來我自己也養成習慣不要一直開啟著一堆視窗不關閉，所以慢慢的也很少遇到這個問題了。

前幾天從 [黑暗執行緒](http://blog.darkthread.net/) 部落格看到 [【茶包射手專欄】Windows桌面開太多東西就"怪怪的"](http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/07/31/desktop-heap-issue.aspx) 文章，才得知原來是 Desktop Heap 不夠的關係所致。基本上 Windows XP 預設的 Desktop Heap 為 3072KB，如果你的記憶體夠大 ( 例如 2GB 以上 )，應該就可以調大些，我個人是不敢調太大，不知道會對電腦造成什麼影響，不過我看 Jeffrey 大大都敢開到 8192KB 了，小弟我也就跟進了。

我原理不講太多，有興趣的可以看本文章最下面的**相關連結**。

接下來我直接講如何修改這個設定，不過如果你是用 Windows Vista 的話，其實是不需要改的，因為 Windows Vista 預設的 Desktop Heap 就開到 20MB 了：

1.  先開啟 regedit.exe 準備修改機碼(Registry)
2.  找到 HKEY\_LOCAL\_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\SubSystems 機碼
3.  找到 Windows 這個 "可擴充字串值"，開啟編輯後預設應該像如下的資料：  
    
    %SystemRoot%\\system32\\csrss.exe ObjectDirectory=\\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16
    
4.  然後將 **SharedSection=1024,3072,512** 改成 **SharedSection=1024,8192,512** 即可設定完成。
5.  最後，重開機就會生效了。

當然，本文章的主旨還是在介紹 Desktop Heap Monitor 工具，這個工具可以看出你的電腦 Desktop Heap 目前的使用率，如果使用率快超過 100% 時，電腦大概就開始要不穩了，以下是我剛用 Desktop Heap Monitor 產生出來的結果，而你要注意的就是 WinSta0\\Default 這一項。

```
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: ( 11456 KB -    9 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    8192             21.4
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128              9.9
  Service-0x0-3e7$\Default            512             25.3
  Service-0x0-3e4$\Default            512              5.6
  Service-0x0-3e5$\Default            512              6.2
  SAWinSta\SADesktop                  512              0.5
  __X78B95_89_IW\__A8D9S1_42_ID       512              0.5
  msswindowstation\mssrestricteddesk  512              2.5
-------------------------------------------------------------
```

眼尖的你應該可以發現我電腦的 Heap Size 已經調到 8192 了，而我目前的 Used Rate 是 21.4%，接下來我連續開啟 10 個「檔案總管」，你可以看到如下的 Used Rate 已經飆到 28.4% 了，因為我已經先將 Heap Size 調到 8192，所以成長的比率只有 7% 而已，如果你還用預設的 3072 的話，可能就會飆高的特別快 ( 19% )。

```
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: ( 11456 KB -    9 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    8192             28.4
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128              9.9
  Service-0x0-3e7$\Default            512             27.5
  Service-0x0-3e4$\Default            512              5.6
  Service-0x0-3e5$\Default            512              6.2
  SAWinSta\SADesktop                  512              0.5
  __X78B95_89_IW\__A8D9S1_42_ID       512              0.5
  msswindowstation\mssrestricteddesk  512              2.5
-------------------------------------------------------------
```

從這個數據看來，我覺得調到 8192 應該已經綽綽有餘了。

因為安裝 Desktop Heap Monitor 有點囉唆，每次在使用的時候也需要特別載入 driver 才能使用，所以我自己寫了一個批次檔可以自動安裝、執行、檢視結果、解除安裝，以下是我整理的安裝執行步驟：

1.  首先，先到 [Desktop Heap Monitor Version 8.1](http://web.archive.org/web/20111117021414/http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17782) 下載安裝程式。
2.  安裝的時候預設會自動解壓縮相關檔案到 c:\\kktools 目錄下，但並不會自動執行。
3.  接下來就直接執行以下的批次檔，就可以自動完成所有應該的動作了。以下是批次檔的內容：

```
@echo off
cd /d c:\kktools\dheapmon8.1\x86
dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols
dheapmon.exe -l
dheapmon.exe > %TEMP%\dheap.txt
start %TEMP%\dheap.txt
dheapmon.exe -u
dheapinst.exe -r
```

當你想看目前 Desktop Heap Size 時，直接點選批次檔就可以完成所有步驟了，且批次檔會自動將 driver 卸載，不會對你的電腦造成負擔。

**相關連結**

-   [【茶包射手專欄】Windows桌面開太多東西就"怪怪的"](http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/07/31/desktop-heap-issue.aspx)
-   [Desktop Heap Overview](http://blogs.msdn.com/ntdebugging/archive/2007/01/04/desktop-heap-overview.aspx)
-   ["Out of Memory" error message appears when you have a large number of programs running](https://web.archive.org/web/20080307115428/http://support.microsoft.com:80/kb/126962)
-   [Desktop Heap Monitor Version 8.1](http://web.archive.org/web/20111117021414/http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17782)
-   [Error message that is similar to the following when you try to install the Desktop Heap Monitor tool: "dheapinst - Win32k.sys symbol load error, correct symbol required"](http://support.microsoft.com/?scid=kb%3Ben-us%3B914216)
-   [Optimizing Applications](https://web.archive.org/web/20090204054133/http://windowsitlibrary.com:80/Content/435/06/7.html)
-   [Windows Desktop Heap Tweak Guide](http://www.techarp.com/showarticle.aspx?artno=238&pgno=1)
-   [User32.dll or Kernel32.dll fails to initialize](http://support.microsoft.com/kb/184802/en-us)
